我的 SQL 函数有啥问题,当我尝试在 C# 中检索它的值时它总是返回 null?

Posted

技术标签:

【中文标题】我的 SQL 函数有啥问题,当我尝试在 C# 中检索它的值时它总是返回 null?【英文标题】:What is wrong with my SQL function that it always returns null when I try to retrieve its value in C#?我的 SQL 函数有什么问题,当我尝试在 C# 中检索它的值时它总是返回 null? 【发布时间】:2013-02-19 03:06:55 【问题描述】:

当我尝试在 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 );

将创建这个字符串:

select * from dbo.FGetNumberOfChikensInThisDate(1391/12/01,4) //日期是波斯语

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

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

我得到一个

""

string 当我在 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 字符串:

"select * from dbo.FSGetNumberOfChikensInThisDate(1391/12/01,4)"

当我到达

result = cmd.ExecuteScalar(); 

部分它会生成一个异常说:

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

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

【问题讨论】:

在异常字符串中是一个错字“chiken”。要么这是这里的错字,要么是代码中的某个地方。 不,我在那里写了鸡肉,这不是重点 您正在连接的用户是否可以访问此功能?从 ADO.NET 连接...不是 SSMS。 我想是的,因为如果我无法访问这些功能,我就无法执行一个,而我可以执行其他的,但这两个似乎有问题! 【参考方案1】:

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

试试这个 SQL 语句:

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

应该返回带有单个未命名 BigInt 列结果的单行。

【讨论】:

我得到 '' 作为值,当我想转换它时,我得到错误:无法将 DBNull 转换为 Int32! 你得到了一个空结果。这是一个很好的开始,如果函数在tblChickens 中找不到与指定日期匹配的任何记录,则结果是正确。检查您的数据集并找到一个有效日期,然后将其以“dd-mmm-yyyy”格式作为第一个参数传递。那你得到什么回报? 试试:SELECT dbo.FSGetNumberOfChikensInThisDate(CAST(GETDATE() AS DATE), 4)

以上是关于我的 SQL 函数有啥问题,当我尝试在 C# 中检索它的值时它总是返回 null?的主要内容,如果未能解决你的问题,请参考以下文章

当我尝试部署我的 rails 应用程序时,这里有啥问题?

我的迭代器实现不起作用,它有啥问题?

C# 和 MySQL .NET 连接器 - 有啥方法可以防止泛型类中的 SQL 注入攻击?

这个 SQL 窗口函数有啥作用?

谁能告诉我这有啥问题?

当我从 C 和 C# 过渡到 C++ 时,我可以期待有啥不同?