gpt4 book ai didi

c# - 将可空整数 (int?SomeValue = NULL) 作为参数传递给存储过程

转载 作者:太空狗 更新时间:2023-10-30 00:49:54 26 4
gpt4 key购买 nike

我正在尝试创建一个需要 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);

这给了我一个错误

Incorrect syntax near ','.

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

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

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

最佳答案

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

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 是否为空。如果是这样, ?? 背后的值(value)使用 - 在您的情况下 DBNull.Value

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

编辑:Null-coalescing reference

关于c# - 将可空整数 (int?SomeValue = NULL) 作为参数传递给存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35115293/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com