【问题标题】:Send null value into stored procedure将空值发送到存储过程
【发布时间】:2012-11-17 07:10:18
【问题描述】:

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

【问题讨论】:

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


【解决方案1】:

这样使用

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?

【讨论】:

    【解决方案2】:

    虽然使用 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 等。希望对您有所帮助。干杯。 :)

    【讨论】:

      【解决方案3】:

      使用DBNull.Value 传递NULL

      【讨论】:

        【解决方案4】:

        您可以添加 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 保留供他们自己使用。
        猜你喜欢
        • 2013-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多