将null值发送到存储过程

时间:2012-11-17 07:10:18

标签: c# asp.net stored-procedures sql-server-2008-r2

如何将表值参数的空值发送到C#中的存储过程?

4 个答案:

答案 0 :(得分:5)

像这样使用

command.Parameters.AddWithValue("@param", DBNull.Value);

这是关于同一主题的良好链接
How to pass a null variable to a SQL Stored Procedure from C#.net code

你可以通过链接。
Using DBNull.Value with SqlParameter without knowing sqlDbType?

答案 1 :(得分:3)

但是使用DBNull.Value有一点问题。假设我在名为IO的商店程序中有一点点。

商店程序中的

   CREATE PROCEDURE [dbo].[stp_Check]
   @IO BIT

然后在代码中我添加如下参数。

   object parameter = new SqlParameter("IO", true); //using false is the same.

然后我调用商店程序

   _repositary.DataContext.Database.SqlQuery<CallDetail>("exec stp_Check @IO", parameter)();

这里_repository是我的带有上下文的DataRepository类。知道它会执行sp就足够了。

您可以使用sql server profiler捕获呼叫。这将产生如下。

declare @p24 int
set @p24=7
exec sp_executesql N'exec stp_Check @IO', --parameter passed
N'@IO bit', -- parameter with the type passed
@IO=1 --parameter value used when executing the sp
select @p24

问题是这个。使用DBNull.Value创建参数时,如下所示。

    object parameter = new SqlParameter("IO", (object)DBNull.Value);

从sql server profiler你可以找到的是

declare @p24 int
set @p24=7
exec sp_executesql N'exec stp_Check @IO', --parameter passed
N'@IO nvarchar(4000)', -- the passes type is not boolean
@IO=NULL --parameter value is NULL
select @p24

确实这会起作用。但这不是预期的。我更喜欢

using System.Data.SqlTypes;

您可以按如下方式传递null。

 object parameter = new SqlParameter("IO", System.Data.SqlTypes.SqlBoolean.Null );

然后请求是这样的。

declare @p24 int
set @p24=7
exec sp_executesql N'exec stp_Check @IO', --parameter passed
N'@IO bit', -- the passes type is boolean
@IO=NULL --parameter value is NULL
select @p24

所有sqltypes都有空值,例如int,bigint,datetime等。希望这有帮助。干杯。 :)

答案 2 :(得分:0)

使用DBNull.Value传递NULL

答案 3 :(得分:-1)

您可以将null添加为默认参数值,如果您希望它为null,则不发送任何值

例如:

create procedure sp_name(@param1 varhcra(10), @param2 varchar(10)=null)

C#

command.Parameters.AddWithValue("@param1", "value1");
//dont pass any value for param2, it is considered null