C#命令.ExecuteScalar():";无法继续执行,因为会话处于终止状态&”;

本文关键字:会话 因为 于终止 终止 状态 ExecuteScalar 命令 quot 继续 执行 | 更新日期: 2023-09-27 18:28:34

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

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

我正在使用SqlConnection/SqlCommand

该命令是一个基本的INSERT INTO。。。105列(和105个用于设置列数据的参数),后面跟着SELECT SCOPE_IDENITY();

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

我甚至不确定这个错误告诉我从哪里开始研究这个问题。

那么这个错误到底意味着什么呢?会话一开始是如何进入终止状态的?

代码非常直接:

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();
    }
}

C#命令.ExecuteScalar():";无法继续执行,因为会话处于终止状态&”;

找到它!

查询中存在约束冲突,导致查询执行失败。它没有在异常中报告该信息,而是报告会话处于"终止状态"(我猜),因为查询提前终止。

我以前从未见过这种错误——通常情况下,约束错误在异常中更有用。

因此,任何收到此错误的人——请仔细检查您的查询,以确保其有效。

您的代码应该如下所示:

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();
    }
}

但请注意,有时存储过程将更适合

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