我试图创建一个需要4个参数的存储过程。这4个参数决定了返回的表的外观。传递Nullable整数(int?SomeValue = NULL)作为参数存储过程
@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服务器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,因为它可以是空值和有效数字?
[请不要与构建串联SQL查询(http://stackoverflow.com/q/332365/11683)。 – GSerg
至于你的问题的正式答案,这是因为'SomeValue',是'null',在结果字符串中插入一个空字符串,这将导致后面的两个逗号。 – GSerg