0

次のように、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()を忘れてしまいました。そうしないと、戻り値がないためです。

4

3 に答える 3

3

ExecuteScalarクエリ( MSDN )によって返された結果セットの最初の行の最初の列を返します。ステートメントは挿入であり、結果セットを返しません。

例を修正する最も簡単な方法は、1つのコマンドですべてのクエリを実行し、を使用SCOPE_IDENTITYして挿入されたIDを取得することです。

string sqlQuery =
    @"INSERT INTO myTable(Name, Number) VALUES (@_Name, @_Number);
      INSERT INTO myOtherTable( ID, FirstName) VALUES ( SCOPE_IDENTITY(), @_First )";
于 2012-12-28T07:44:21.917 に答える
0

insertステートメントは値を返さないためExecuteScalar()、必要に応じてIDを返すことはできません。ドキュメントののようにinsertとを組み合わせて、期待している機能を取得できます。select scope_identity()ExecuteScalar()

于 2012-12-28T07:47:42.347 に答える
0

INSERT INTO myTable(Name, Number) VALUES (@_Name, @_Number)挿入された行のIDが返されると想定しているようです。どうしてそんなことを考えるのか?仮定が正しくないため、ExecuteScalarからnull値が返されます。

コマンドの結果セットが空の場合、ExecuteScalarはnullを返します。また、 OUTPUT句を含めない限り、 INSERTステートメントの結果セットは実際には空です。

于 2012-12-28T07:50:43.913 に答える