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

Irf*_*rfy 63 c# sql sql-server stored-procedures

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

SqlHelper.ExecuteDataset(sqlConnection, CommandType.StoredProcedure, STORED_PROC_NAME, sqlParameters);
Run Code Online (Sandbox Code Playgroud)

其中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;
Run Code Online (Sandbox Code Playgroud)

我现在需要将另外两个参数传递给这个存储过程(两者都是类型SqlDateTime),在这种情况下它们将变为NULL.

谢谢,

Jus*_*ner 80

SqlParameters[1] = new SqlParameter("Date1", SqlDbType.SqlDateTime);
SqlParameters[1].Value = DBNull.Value;
SqlParameters[1].Direction = ParameterDirection.Input;
Run Code Online (Sandbox Code Playgroud)

...然后复制第二个.


Dan*_*plo 26

使用DBNull.Value 更好,使存储过程参数的默认值为NULL.Nullable<DateTime>如果参数有时是有效的DateTime对象,请使用参数

  • 作为第一个提到存储过程可能性的默认参数的人,你获得+1. (2认同)

mar*_*c_s 9

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

    SqlParameters[0] = new SqlParameter("LedgerID", SqlDbType.BigInt );
    SqlParameters[0].Value = DBNull.Value;
Run Code Online (Sandbox Code Playgroud)

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


Doo*_*ght 7

如果它为null,我使用一个方法转换为DBNull

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

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

    sqlComm.Parameters.Add(new SqlParameter("@NoteNo", LibraryHelper.ToDBNull(NoteNo)));
Run Code Online (Sandbox Code Playgroud)

这将确保任何空值,更改为DBNull.Value,否则它将保持不变.


Lav*_*tis 6

老问题,但这是一个相当干净的方法来创建一个可以为null的参数:

new SqlParameter("@note", (object) request.Body ?? DBNull.Value);
Run Code Online (Sandbox Code Playgroud)

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