【发布时间】:2012-11-17 07:10:18
【问题描述】:
如何将表值参数的空值发送到 C# 中的存储过程?
【问题讨论】:
标签: c# asp.net stored-procedures sql-server-2008-r2
如何将表值参数的空值发送到 C# 中的存储过程?
【问题讨论】:
标签: c# asp.net stored-procedures sql-server-2008-r2
这样使用
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?
【讨论】:
虽然使用 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
【讨论】:
sp_ 前缀!该前缀由 Microsoft 保留供他们自己使用。