我正在尝试创建一个需要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
Run Code Online (Sandbox Code Playgroud)
在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';
...
Run Code Online (Sandbox Code Playgroud)
但是在C#端,以下代码无法执行:
int? SomeValue = null;
Adapter = new SqlDataAdapter("exec GetData '15'," + SomeValue + ",null,'1';", Connection);
Adapter.Fill(Data);
Run Code Online (Sandbox Code Playgroud)
这给了我一个错误
','附近的语法不正确.
如果我将SomeValue变量更改为1,它的工作完全正常.
DBNull.Value 并简单地将参数保留为''也不起作用.
所以问题是:如果可以将可空整数传递给SQL,我将如何能够将可空整数传递给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);
Run Code Online (Sandbox Code Playgroud)
它??被称为null-coalescing运算符并检查if是否SomeValue为null.如果是这样,背后的价值?用 - 在你的情况下DBNull.Value.
正如GSerg已经指出的那样,始终将Little Bobby Tables放在脑后.
编辑:空 - 合并参考
| 归档时间: |
|
| 查看次数: |
5826 次 |
| 最近记录: |