次のように、SqlTransaction内で実行されるマルチステートメントSQLクエリがあります。
string sName = "";
string sNumber = "";
string sFirstName = "";
string sqlQuery1 = @"INSERT INTO myTable(Name, Number) VALUES (@_Name, @_Number)";
string sqlQuery2 = @"INSERT INTO myOtherTable( ID, FirstName) VALUES ( @_ID, @_First )";
SqlConnection conn = new SqlConn(***);
conn.Open();
SqlTransaction transaction;
SqlCommand command1 = new SqlCommand(sqlQuery1, conn, transaction);
SqlCommand command2 = new SqlCommand(sqlQuery2, conn, transaction);
command1.Parameters.Add("@_Name", SqlDbType.NVarChar, 255).Value = sName;
command1.Parameters.Add("@_Number", SqlDbType.NVarChar, 255).Value = sNumber;
int? returnedID = (int?)command1.ExecuteScalar();
command2.Parameters.Add("@_ID", SqlDbType.Int).Value = (int)returnedID; <--- Error
command2.Parameters.Add("@_First", SqlDbType.NVarChar, 255).Value = sFirstName;
command2.ExecuteNonQuery();
transaction.Commit();
エラーとしてマークした行で、実行中に「パラメーター化されたクエリは、指定されていないパラメーター@_IDを予期しています。
ここで、この例のコードを単純化するときにタイプミスがないと仮定すると、正しく実行されたステートメントのreturnedIDでnull値を受け取るのはなぜですか?クエリでステートメントを単独で実行すると、エラーは発生せず、成功を返します。このトランザクションで実行するときになぜnullになるのですか?ありがとう!
編集:私が持っていた質問とは関係がなかったので、私は意図的にこれからtry{}キャッチを省略しました。それ以外の場合は、挿入クエリで必要なIDENTITY_SCOPE()を忘れてしまいました。そうしないと、戻り値がないためです。