【问题标题】:C# ASP.Net Parameters.AddWithValue rejecting null value for parameterC# ASP.Net Parameters.AddWithValue 拒绝参数的空值
【发布时间】:2012-03-20 01:31:25
【问题描述】:

我正在使用存储过程填充表。该表允许名称的中间首字母为“null”,但我收到以下错误消息:

过程或函数“uspInsertPersonalAccountApplication”需要参数“@MiddleInitial”,但未提供。

提前致谢!

   public void ProcessForm(string[] InputData)
    {
        string ConnString = System.Configuration.ConfigurationManager.ConnectionStrings["AssociatedBankConnectionString"].ToString();

        SqlConnection conn = new SqlConnection(ConnString);
        SqlCommand cmd = new SqlCommand("uspInsertPersonalAccountApplication", conn);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@AccountType", "Savings");
        cmd.Parameters.AddWithValue("@AccountSubType", "Savings");
        cmd.Parameters.AddWithValue("@ExistingCustomer","No");
        conn.Open();
        cmd.ExecuteNonQuery();

        conn.Close();
    }

【问题讨论】:

    标签: c# asp.net sql stored-procedures


    【解决方案1】:

    尝试传入DBNull.Value 而不是null

    【讨论】:

    • 我传入了 53 个参数,其中许多可以为空。如何动态设置 DBNull.Value 而不将每个分配包装在 IF 语句中?
    • 在值之后添加?? DBNull.Value,或者创建一个类似AddValueWithNonNullParameter的函数来为你做这件事
    • 喜欢这个? Intellisense 给我一个错误,Intellisense 无法识别 AddValueWithNullParameter ------- cmd.Parameters.AddWithValue("@MiddleInitial", InputData[11] ?? DBNull.Value);
    • 是的 ?? 示例应该可以工作。如果?? 之前的值为null,则返回?? 之后的值。函数 AddValueWithNonNullParameter 不存在,你必须自己实现它:)
    • 试试((object) InputData[11]) ?? DBNull.Value ?
    【解决方案2】:

    为 MiddleInitial 添加参数也为 Null 值

    public void ProcessForm(string[] InputData)
        {
            string ConnString = System.Configuration.ConfigurationManager.ConnectionStrings["AssociatedBankConnectionString"].ToString();
    
            SqlConnection conn = new SqlConnection(ConnString);
            SqlCommand cmd = new SqlCommand("uspInsertPersonalAccountApplication", conn);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddWithValue("@AccountType", "Savings");
            cmd.Parameters.AddWithValue("@AccountSubType", "Savings");
            cmd.Parameters.AddWithValue("@ExistingCustomer","No");
            cmd.Parameters.AddWithValue("@MiddleInitial",DBNull.Value);
            conn.Open();
            cmd.ExecuteNonQuery();
    
            conn.Close();
        }
    

    【讨论】:

      【解决方案3】:

      您需要声明所有内容 - 即使它为空。

      DBNull.Value 用于MiddleInitial

      cmd.Parameters.AddWithValue("@MiddleInitial",DBNull.Value);
      

      【讨论】:

        【解决方案4】:

        嘿,你必须设置存储过程

        @MiddleInitial varhcar(8) = null
        

        【讨论】:

        • +1 这实际上可以工作,因为参数变为可选
        【解决方案5】:

        这里有两个选项:

        修改您的存储过程并使 @MiddleInitial 参数可选(当前不是可选的,这就是引发错误的原因)

        @MiddleInitial nvarchar(10) = NULL
        

        或在您的代码中添加以下行:

        cmd.Parameters.AddWithValue("@MiddleInitial", null);
        

        【讨论】:

        • 我传入了 53 个参数,其中许多可以为空。如何动态设置 DBNull.Value 而不将每个分配包装在 IF 语句中?
        • 如果可以修改存储过程,则修改可以为空的参数,并在存储过程声明中使其可选。这是最灵活的解决方案。如果这不可能,您可以使用SqlCommandBuilder.DeriveParameters(command); 并在循环中为它们中的每一个设置DBNull.Value。然后分配你想要的。
        • 查看 cmets 到 stackoverflow.com/a/9518215/8479:使用 cmd.ParametersAddWithValue("@MiddleInitial", (object)yourVal ?? DBNull.Value); 或添加类似 AddParamWithValueOrNull() 的扩展方法
        • 我试过 AddWithValue("@param", null);这没有用。在存储过程中设置默认值(即@param datetime = null)修复它。
        【解决方案6】:

        您可以添加到项目并使用以下扩展方法:

        public static SqlParameter AddWithValueSafe(this SqlParameterCollection parameters, string parameterName, object value)
        {
            return parameters.AddWithValue(parameterName, value ?? DBNull.Value);
        }
        

        【讨论】:

          【解决方案7】:

          我创建了一个扩展方法来解决这个问题。如果您可以更新存储过程,Marcin 的建议也值得考虑。

          cmd.Parameters.AddString("@MyParamName", myValue);
          
          
          public static class SQLExtension
          {
              public static void AddString(this SqlParameterCollection collection, string parameterName, string value)
              {
                  collection.AddWithValue(parameterName, ((object)value) ?? DBNull.Value);
              }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-01-20
            • 2021-02-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多