2

私は SELECT ストアド プロシージャから SqlDataReader を実行しましたが、それらの値を保持しています。そのうちのいくつかは null である可能性があります...私の知らないうちに。これらの値を 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に対してはるかに優れたアプローチです。それらを前もって追加しないでください。オンデマンドで追加します。


ヨシさんのご指摘の通りです。本当に必要なのはこれだけです:

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

@neoistheone の回答を拡張するにはDBNull.Value、値が null の場合も渡す必要があります。

次の拡張メソッドを使用します。

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 に答える