2009-07-30 64 views
45

林从一块C#的.NET代码调用SQL存储过程存储过程SQL:如何空变量传递给从C#的.NET代码

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在这种情况下。

感谢,

IN

回答

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

...然后第二个副本。

9

您可以通过DBNull.Value到参数的.Value属性:

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

只需调整你的两个日期时间参数,显然 - 只是展示了如何使用DBNull.Value属性值在这里。

马克

23

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

+2

作为第一个提到存储过程可能性的默认参数的人,您会得到+1。 – Beska 2009-07-30 15:42:21

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

我用的方法转换为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,否则它将保持不变。

+1

这是很好的解决方案我将静态方法更改为扩展方法的对象`公共静态对象ToDbNull(此对象值) { if(null!=值) 返回值; return DBNull.Value; }` – Gayan 2015-04-07 08:11:31

0

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

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

假设参数的名称是“ID”,在你的SQL存储过程,你正在使用调用数据库的存储过程是int?类型的名称的C#功能。鉴于此,以下可能解决您的问题:

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... 
1

老问题,但这里有一个相当干净的方法来创建一个可空参数:

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

如果request.Body有一个值,那么它的价值用过的。如果它为空,则使用DbNull.Value。