2

我已经从一个 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(); 
    }
4

3 回答 3

0

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

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

代替:

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

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


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

insbuRenewal.Parameters.AddWithValue("@TransactionID", reader["TransactionID"]);
于 2013-10-07T19:27:38.430 回答
0

要扩展@neoistheone 的答案,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());
于 2013-10-07T19:35:07.003 回答
0

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

你真的不需要自己做演员。

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

insbuRenewal.Parameters.Add(
    "@TransactionID", SqlDbType.VarChar, 256).Value = "somestring..";
于 2013-10-07T19:39:11.007 回答