4

ExecuteScalar()Web上でヘルプが見つからない という奇妙な例外を取得します:

セッションが強制終了状態のため、実行を続行できません。

SqlConnection/SqlCommand を使用しています

コマンドは基本的な INSERT INTO... で、105 列 (および列データを設定するための 105 個のパラメーター) があり、その後に SELECT SCOPE_IDENTITY(); が続きます。

接続文字列を確認しました - それは正しく、接続は開いています。

このエラーが何を示しているのか、このエラーをどこから調べればよいのかさえわかりません。

では、このエラーは正確には何を意味するのでしょうか? そもそもセッションはどのようにして kill 状態になるのでしょうか?

コードは非常に簡単です。

using (SqlConnection conn = new SqlConnection(connString))
{
    conn.Open();
    using (SqlCommand cmd = new SqlCommand(@"INSERT INTO VendorNote (VendorId, AdminComment...) VALUES (@VendorId, @AdminComment, ...); SELECT SCOPE_IDENTITY(); ", conn))
    {
        cmd.Parameters.AddWithValue("@VendorId", VendorId);
        cmd.Parameters.AddWithValue("@AdminComment", AdminComment);
        Id = (int) cmd.ExecuteScalar();
    }
}
4

3 に答える 3

7

それを見つけた!

クエリの実行が失敗する原因となった制約違反がクエリにありました。例外でその情報を報告する代わりに、クエリが途中で終了したため、セッションが「強制終了状態」にあると報告していました (私は推測しています)。

私はこれまでこのエラーを見たことがありません - 通常、制約エラーなどには、例外でより便利なものがあります。

したがって、このエラーが発生した人は誰でも-クエリを実際にチェックして、有効であることを確認してください。

于 2015-12-29T22:13:55.990 に答える
1

コードは次のようになります。

const string sqlString = "INSERT INTO dbo.Table ( ....) " +
                         "               VALUES ( .... );" +
                         "SELECT SCOPE_IDENTITY();";
using (conn)
{
    using (var cmd = new SqlCommand(sqlString, conn))
    {
        cmd.Parameters.AddWithValue("@param", param);

        cmd.CommandType = CommandType.Text;
        conn.Open();
        return (int) (decimal) cmd.ExecuteScalar();

    }
}

ただし、ストアド プロシージャの方が適切な場合があることに注意してください。

于 2015-12-29T20:13:13.300 に答える