插入不接受空值的存储过程

本文关键字:存储过程 空值 不接受 插入 | 更新日期: 2023-09-27 18:34:12

我已经从 SELECT 存储过程执行了一个 SqlDataReader,并保存了这些值,其中一些值可能是空的......在我不知情的情况下。我正在尝试将这些值传递到 INSERT 存储过程的参数中。

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

"程序或函数'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(); 
    }

插入不接受空值的存储过程

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

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

而不是:

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

对于所有参数,AddWithValue接口是一种更好的方法。不要预先添加它们;按需添加它们。


正如Yosi指出的那样。你真正需要的是这个:

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

要扩展@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());

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

你真的不需要自己做选角。

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

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