我已经从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();
}
答案 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..";