如何将表值参数的空值发送到 C# 中的存储过程?
4 回答
像这样使用
command.Parameters.AddWithValue("@param", DBNull.Value);
这是关于同一主题的一个很好的链接
How to pass a null variable to a SQL Stored Procedure from C#.net code
您可以通过链接。
在不知道 sqlDbType 的情况下将 DBNull.Value 与 SqlParameter 一起使用?
但是使用 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 等。希望对您有所帮助。干杯。:)
DBNull.Value
用来通过NULL
。
您可以将 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