【问题标题】:How to pass a null variable to a SQL Stored Procedure from C#.net code如何从 C#.net 代码将空变量传递给 SQL 存储过程
【发布时间】:2010-11-15 11:56:08
【问题描述】:

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

谢谢,

输入

【问题讨论】:

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


    【解决方案1】:
    SqlParameters[1] = new SqlParameter("Date1", SqlDbType.SqlDateTime);
    SqlParameters[1].Value = DBNull.Value;
    SqlParameters[1].Direction = ParameterDirection.Input;
    

    ...然后复制第二个。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 如果您是第一个提及存储过程可能性的默认参数的人,您将获得 +1。
      【解决方案3】:

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

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

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

      马克

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          【解决方案5】:

          如果为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,否则它将保持不变。

          【讨论】:

          • 这是一个很好的解决方案我将静态方法更改为对象的扩展方法public static object ToDbNull(this object value) { if (null != value) return value; return DBNull.Value; }
          • 除非 DateTime 不是可为空的类型,因此这不适用于 DateTime (如问题中所述)或任何其他不可为空的值类型,除非您声明所有您vars 为 Nullable 这似乎不是一个特别好的方法。
          • 简单地使用空合并运算符可能比使用这种扩展方法更简单:new SqlParameter("@NoteNo", NoteNo as object ?? System.DbNull)
          【解决方案6】:

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

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

          【讨论】:

            【解决方案7】:
                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
            

            【讨论】:

              【解决方案8】:

              假设您的 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...
              

              【讨论】:

                猜你喜欢
                • 2011-09-15
                • 1970-01-01
                • 2016-06-27
                • 1970-01-01
                • 2015-12-20
                • 1970-01-01
                相关资源
                最近更新 更多