如何从C#.net代码向SQL存储过程传递空变量


69

我从一段C#.net代码中调用SQL存储过程:

SqlHelper.ExecuteDataset(sqlConnection, CommandType.StoredProcedure, STORED_PROC_NAME, sqlParameters);

其中sqlParameters变量被定义为:

        SqlParameter[] sqlParameters = new SqlParameter[SQL_NUMBER_PARAMETERS];

        Log.Logger.Debug(string.Format("Running proc: {0} ", STORED_PROC_NAME));

        SqlParameters[0] = new SqlParameter("fieldID", SqlDbType.BigInt );
        SqlParameters[0].Value = fieldID;
        SqlParameters[0].Direction = ParameterDirection.Input;

现在,我需要将另外两个参数传递给此存储过程(均为Type SqlDateTime),在这种情况下将变为NULL

谢谢,

Answers:


85
SqlParameters[1] = new SqlParameter("Date1", SqlDbType.SqlDateTime);
SqlParameters[1].Value = DBNull.Value;
SqlParameters[1].Direction = ParameterDirection.Input;

...然后复制第二个。


27

DBNull.Value 仍然使用“更好”,使您的存储过程参数的默认值为NULL。或使用Nullable<DateTime>参数(如果该参数有时是有效的DateTime对象)


2
如果您是第一个提到存储的proc可能性的默认参数的人,您将获得+1。
Beska

10

您可以将传递给DBNull.Value参数的.Value属性:

    SqlParameters[0] = new SqlParameter("LedgerID", SqlDbType.BigInt );
    SqlParameters[0].Value = DBNull.Value;

显然,只需调整两个DateTime参数-DBNull.Value此处仅显示如何使用属性值。

马克


7

如果为空,我使用一种方法转换为DBNull

    // Converts to DBNull, if Null
    public static object ToDBNull(object value)
    {
        if (null != value)
            return value;
        return DBNull.Value;
    }

因此在设置参数时,只需调用函数

    sqlComm.Parameters.Add(new SqlParameter("@NoteNo", LibraryHelper.ToDBNull(NoteNo)));

这将确保所有null,将其更改为DBNull.Value,否则它将保持不变。


1
这是一个很好的解决方案,我将静态方法更改为对象的扩展方法public static object ToDbNull(this object value) { if (null != value) return value; return DBNull.Value; }
Gayan 2015年

除了DateTime不是可为空的类型之外,因此它不适用于DateTime(在问题中指定)或任何其他非可为空的值类型,除非您声明所有var为Nullable <T>似乎不是一个特别好的方法。
C. Ridley 2015年

简单地使用空合并运算符可能比使用这种扩展方法更简单,更有趣:new SqlParameter("@NoteNo", NoteNo as object ?? System.DbNull)
saluce

6

老问题了,但这是创建可空参数的一种相当干净的方法:

new SqlParameter("@note", (object) request.Body ?? DBNull.Value);

如果request.Body有一个值,则使用它的值。如果为null,则使用DbNull.Value。


1

尝试这个!语法更少的行,甚至更紧凑!不要忘记使用这种方法添加要添加的属性!

cmd.Parameters.Add(new SqlParameter{SqlValue=(object)username??DBNull.Value,ParameterName="user" }  );

0
    SQLParam = cmd.Parameters.Add("@RetailerID", SqlDbType.Int, 4)
    If p_RetailerID.Length = 0 Or p_RetailerID = "0" Then
        SQLParam.Value = DBNull.Value
    Else
        SQLParam.Value = p_RetailerID
    End If

0

假设在您的SQL存储过程中参数的名称为“ Id”,而用于调用数据库存储过程的C#函数的名称为type int?。鉴于此,以下可能会解决您的问题:

public void storedProcedureName(Nullable<int> id, string name)
{
    var idParameter = id.HasValue ?
                new SqlParameter("Id", id) :
                new SqlParameter { ParameterName = "Id", SqlDbType = SqlDbType.Int, Value = DBNull.Value };

    // to be continued...
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.