sql server-我的sql函数有什么问题,当我试图在C#中检索它的值时,它总是返回null

本文关键字:sql 检索 返回 null 函数 我的 server- 什么 问题 | 更新日期: 2023-09-27 18:00:06

当我试图在C#中检索它的值时,我的SQL函数总是返回null,这是怎么回事?该函数在SQL设计器中运行得相当稳定,但当我尝试使用C#运行它时,它失败了。

这是我的函数定义。首先是表值函数:

ALTER FUNCTION dbo.FGetNumberOfChikensInThisDate
    (
    @Date nvarchar(12),
    @IDSource bigint
    )
RETURNS Table 
AS
    RETURN SELECT     SUM(NumberOfChicken) AS Number of Chickens  
       FROM            tblChickens
           WHERE        (SourceID= @IDSource) AND (ReservedDate = @Date)

这就是标量值函数:

ALTER FUNCTION dbo.FSGetNumberOfChikensInThisDate
    (
    @Date nvarchar(12),
    @IDSource bigint
    )
RETURNS bigint
AS
 BEGIN
  DECLARE  @ret bigint;
   SELECT      @ret=  SUM(NumberOfChicken) 
       FROM            tblChickens
          WHERE        (ReserveDate = @Date) AND (SourceID= @IDSource)
RETURN @ret;
END;

我使用这两种方法为这些函数创建SQL命令字符串,并传递它们的参数并从C#执行它们:对于基于表的函数,我使用:

public static DataTable ExecuteSqlFunction(string functionName, string[] Functionparamers)
        {
            SqlDataAdapter reader = new SqlDataAdapter();
            DataTable table = new DataTable();
            string query = "select * from " + functionName + "(";
            int index = 0;
            foreach (string item in Functionparamers)//{0},{0}
            {
                query += String.Format("{0}", item);
                query += ++index >= Functionparamers.Length ? String.Format(")", item) : ",";
            }
            if (connection.State != ConnectionState.Open)
            { connection.Open(); }
            cmd = new SqlCommand(query, connection);
            reader.SelectCommand = cmd;
            reader.Fill(table);
            connection.Close();
            return table;
        }

并像这样使用它:

ExecuteSqlFunction("dbo.FGetNumberOfChikensInThisDate",new string[] { Date, API.CurrentSourceID });

将创建以下字符串:

从dbo中选择*。FGetNumberOfChikensInThisDate(1391/12/01/4)//日期为波斯语

返回的DataTable对象有一行,但当我写时

dataTable.Rows[0][0].ToString();

我有

"

字符串,而当我在SQL上运行此SQL命令时,它运行得很好!(实际上,我试图在SQL设计器中执行这个函数的SQL命令,结果很好,但当我尝试使用c#运行它时,它的行为就是这样的)。

对于标量值函数,使用相同的前一种方法,最后略有变化:

 public static object ExecuteScalarSqlFunction(string functionName, string[] FunctionParameters)
        {
            string query = "select * from " + functionName + "(";
            int index = 0;
            object result;
            foreach (string item in FunctionParameters)//{0},{0}
            {
                query += String.Format("{0}", item);
                query += ++index >= FunctionParameters.Length ? String.Format(")", item) : ",";
            }
            if (connection.State != ConnectionState.Open)
            { connection.Open(); }
            cmd = new SqlCommand(query, connection);
            result = cmd.ExecuteScalar();
            connection.Close();
            return result;
        }

这样调用这个函数:

ExecuteScalarSqlFunction("dbo.FSGetNumberOfChikensInThisDate",new string[] { Date, API.CurrentSourceID });

将创建此SQL字符串:

"从数据库中选择*。FSGetNumberOfChikensInThisDate(1391/12/01,4)"

当我到达时

result = cmd.ExecuteScalar(); 

它生成一个异常,称:

对象名称"dbo.FSGetNumberOfChikensInThisDate"无效。而它确实存在!就在那里!。

ExecuteSqlFunction()适用于我的其余函数,但这些都是失败的异常。ExecuteScalarFunction没有经过测试,因为我不知道我是否遗漏了其中的任何内容,但我确信处理表值SQL函数的ExecuteSqlFunction是可以的,所以它一定是我在这里遗漏的其他内容。

sql server-我的sql函数有什么问题,当我试图在C#中检索它的值时,它总是返回null

函数FSGetNumberOfChikensInThisDate返回一个标量值-类型为bigint的单个结果-不能用作SELECT语句的源。但是,它可以用作SELECT语句的列源。

请改用以下SQL语句:

SELECT dbo.FSGetNumberOfChikensInThisDate('1391/12/01', 4);

应返回一行,其中包含一个未命名的BigInt列结果。