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

时间:2009-07-30 15:36:40

标签: c# sql sql-server stored-procedures

我从一段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;

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

谢谢,

8 个答案:

答案 0 :(得分:79)

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

...然后复制第二个。

答案 1 :(得分:25)

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

答案 2 :(得分:9)

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

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

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

马克

答案 3 :(得分:7)

如果它为null,我使用一种方法转换为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)));

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

答案 4 :(得分:6)

旧问题,但这是一种创建可以为空的参数的相当简洁的方法:

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

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

答案 5 :(得分:1)

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

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

答案 6 :(得分: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

答案 7 :(得分:0)

假设SQL存储过程中参数的名称为“Id”,并且用于调用数据库存储过程的C#函数是类型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...