我已经从 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..";