如何将表值参数的空值发送到C#中的存储过程?
答案 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