3

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

4

4 回答 4

5

像这样使用

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 一起使用?

于 2012-11-17T07:12:47.150 回答
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 等。希望对您有所帮助。干杯。:)

于 2014-03-09T09:15:30.353 回答
0

DBNull.Value用来通过NULL

于 2012-11-17T07:16:09.747 回答
-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
于 2012-11-17T07:15:27.237 回答