【问题标题】:Passing Nullable Integer (int? SomeValue = NULL) As Parameter To Stored Procedure将 Nullable Integer (int? SomeValue = NULL) 作为参数传递给存储过程
【发布时间】:2016-01-31 15:03:52
【问题描述】:

我正在尝试创建一个需要 4 个参数的存储过程。这 4 个参数决定了返回表的外观。

@C_ID 参数始终为数字。 @U_ID@P_ID 值可以包含有效的数值,或者可以(或应该)作为 NULL 传递,因此 WHERE 条件可以执行或不执行。

ALTER PROCEDURE [dbo].[GetData]
    @C_ID integer,
    @U_ID integer = Null,
    @P_ID integer = Null,
    @SortIndex integer = 1
AS 
BEGIN
    SELECT
        ID, P_ID, U_Name, P_Name, 
        FORMAT(Date_When, 'dd/MM/yyyy hh:mm tt')
    FROM 
        SomeTable
    WHERE 
        C_ID = @C_ID 
        AND (@P_ID IS NULL OR P_ID = @P_ID) 
        AND (@U_ID IS NULL OR U_ID = @U_ID)
   ORDER BY 
        CASE WHEN @SortIndex = 1 THEN -ID 
             ELSE ID 
        END ASC
END

在 SQL Server 2014 上,以下执行工作正常,没有任何错误:

exec GetData '15', null, null, '1';
exec GetData '15', '1', null, '1';
exec GetData '15', null, '1', '1';
exec GetData '15', '1', '1', '1';
...

但是在 C# 端,以下代码无法执行:

int? SomeValue = null;
Adapter = new SqlDataAdapter("exec GetData '15'," + SomeValue + ",null,'1';", Connection);
Adapter.Fill(Data);

这给了我一个错误

',' 附近的语法不正确。

如果我将 SomeValue 变量更改为 1,它就可以正常工作。

DBNull.Value 并将参数保留为 ' ' 也不起作用。

所以问题是:我如何(如果可能的话)能够将可为空的整数传递给 SQL,因为它既可以是 null 也可以是有效数字?

【问题讨论】:

标签: c# sql sql-server


【解决方案1】:

按照这些思路做一些事情:

Adapter = new SqlDataAdapter();

//con is an open SQLConnection
var cmd = new SQLCommand("GetData", con);
cmd.Parameters.Add(new SqlParameter("@C_ID", 15));
cmd.Parameters.Add(new SqlParameter("@U_ID", SomeValue ?? DBNull.Value));
cmd.Parameters.Add(new SqlParameter("@P_ID", SomeValue ?? DBNull.Value));
cmd.Parameters.Add(new SqlParameter("@SortIndex", 1));
cmd.CommandType = CommandType.StoredProcedure;
Adapter.SelectCommand = cmd;
Adapter.Fill(Data);

?? 称为空合并运算符并检查 SomeValue 是否为空。如果是这样,背后的价值??使用 - 在你的情况下DBNull.Value

正如 GSerg 已经指出的那样,请始终将 Little Bobby Tables 放在脑后。

编辑:Null-coalescing reference

【讨论】:

  • 非常感谢,我好像没遇到过??之前的运算符。
  • 运算符'??'不能应用于“int”类型的操作数?和 'System.DBNull' 如果我将其更改为 SomeValue ?? (对象)DBNull.Value 我得到:ExecuteReader:CommandText 属性尚未初始化
  • 哦,我忘记将有效连接传递给 SQLCommand。你需要这样做:var cmd = new SQLCommand("GetData", con); 其中con 是一个开放的SQLConnection。这加上将 DBNull.Value 转换为对象,就像你已经做过的那样,应该可以解决问题。
  • 在将整数转换为对象之前它不会起作用。 ("@CategoryID", (object)id ?? DBNull.Value)
【解决方案2】:

您尝试过以下类似的方法吗?

SomeValue ?? "null"

【讨论】:

    猜你喜欢
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 2016-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多