C# 当我试图在C中检索SQL函数的值时,它总是返回null,这是怎么回事?

C# 当我试图在C中检索SQL函数的值时,它总是返回null,这是怎么回事?,c#,sql-server,user-defined-functions,C#,Sql Server,User Defined Functions,当我试图在C中检索SQL函数的值时,它总是返回null,这是怎么回事?该函数在SQL设计器中运行得相当稳定,但当我尝试使用C运行它时,它失败了 这是我的函数定义。首先是表值函数: ALTER FUNCTION dbo.FGetNumberOfChikensInThisDate ( @Date nvarchar(12), @IDSource bigint ) RETURNS Table AS RETURN SELECT SUM(NumberOfCh

当我试图在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.FGetNumberOfChikensInThisDate1391/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字符串:

在本日期1391/12/01,4的dbo.fsGetNumberOfChikens中选择*

当我到达终点时

result = cmd.ExecuteScalar(); 
第节它生成一个异常,说明:

对象名称“dbo.FSGetNumberOfChikensInThisDate”无效。 虽然它确实存在!还有

ExecuteSqlFunction正在为我的其余函数工作,但这些都是失败的异常。ExecuteScalarFunction没有经过测试,因为我不知道是否遗漏了任何内容,但我确信处理表值SQL函数的ExecuteSqlFunction没有问题,因此我在这里遗漏了其他内容。

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

请尝试以下SQL语句:

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

应返回一行和一个未命名的BigInt列结果。

异常字符串中有一个拼写错误。这可能是这里的输入错误,也可能是你代码中的某个地方。不,我在那里写了chicken,这不是问题,你连接的用户有权访问这个函数吗?从ADO.NET连接…不是SSMS。我想是的,因为如果我没有访问这些函数的权限,我不可能执行一个,而我可以执行其他函数,但这两个函数似乎有问题!我得到了{}作为值,当我想强制转换它时,我得到了一个错误:cant cast DBNull to Int32!!你得到了一个空结果。这是一个很好的开始,如果函数在tblChickens中找不到与指定日期匹配的任何记录,则这是一个正确的结果。检查数据集并找到有效日期,然后以“dd-mmm-yyyy”格式将其作为第一个参数传递。那么您会得到什么回报?尝试:选择dbo.FSGetNumberOfChikensInThisDateCASTGETDATE作为日期,4