INSERT存储过程不接受空值

时间:2013-10-07 19:23:09

标签: c# .net ado.net

我已经从SELECT存储过程执行了一个SqlDataReader,并且持有这些值,其中一些可能是null ...我不知道。我试图将这些值传递给INSERT存储过程的参数。

当我尝试传递值时,我收到此错误:

  

“Proccedure或function'insbuRenewal'需要参数   '@TransactionID',未提供“

我的代码:

try
{
    while (reader.Read())
    {
        insbuRenewal.Parameters["@SolarID"].Value = (decimal)reader["SolarID"];
        insbuRenewal.Parameters["@ApplicationID"].Value
            = reader["ApplicationID"].ToDecimalOrNull();
        insbuRenewal.Parameters["@TransactionID"].Value
            = reader["TransactionID"].ToStringOrNull();
        insbuRenewal.Parameters["@Host"].Value
            = reader["Host"].ToStringOrNull();

    public static string ToStringOrNull(this object items)
    {
        if (items == null || items == DBNull.Value)
        {
            return null;
        }
        return items.ToString(); 
    }

3 个答案:

答案 0 :(得分:0)

如果你这样做,你可以使用你拥有的方法:

insbuRenewal.Parameters.AddWithValue("@TransactionID",
    reader["TransactionID"].ToStringOrNull());

而不是:

insbuRenewal.Parameters["@TransactionID"].Value =
    reader["TransactionID"].ToStringOrNull();

对于所有参数,AddWithValue界面是一种更好的方法。不要预先添加它们;根据需要添加它们。


正如Yosi指出的那样。所有你真正需要的是:

insbuRenewal.Parameters.AddWithValue("@TransactionID", reader["TransactionID"]);

答案 1 :(得分:0)

要扩展@ neoistheone的答案,如果您的值为null,则还需要传入DBNull.Value

采用此扩展方法:

public static void AddParameter(this SqlCommand cmd, string name, object value)
{
    if (value == null)
        cmd.Parameters.AddWithValue(name, DBNull.Value);
    else
        cmd.Parameters.AddWithValue(name, value);
}

现在这样称呼:

insbuRenewal.AddParam("@ApplicationID", 
    reader["ApplicationID"].ToDecimalOrNull());

答案 2 :(得分:0)

您应该使用DBNull代替null。通常,您需要将对象转换为数据库类型,这样null将自动转换为DBNull

您不需要自己进行投射。

添加每个参数时需要指定数据库类型:

insbuRenewal.Parameters.Add(
    "@TransactionID", SqlDbType.VarChar, 256).Value = "somestring..";