4

得到一个奇怪的例外ExecuteScalar(),我在网上找不到任何帮助:

无法继续执行,因为会话处于终止状态。

我正在使用 SqlConnection/SqlCommand

该命令是一个基本的 INSERT INTO... 具有 105 列(和 105 个用于设置列数据的参数),然后是 SELECT SCOPE_IDENTITY();

我检查了连接字符串 - 它是正确的并且连接是打开的。

我什至不确定这个错误告诉我从哪里开始查看这个错误。

那么这个错误到底是什么意思呢?会话如何开始处于终止状态?

代码非常简单:

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 回答
2

这可能是由于 Always On 可用性组“故障转移”...每当我有一个正在运行的查询、连接到一个 AG 侦听器并且发生故障转移时,我都会收到一个SqlException,其消息为“无法继续执行,因为会话处于终止状态。'...

于 2018-05-09T16:47:52.280 回答
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 回答