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();
}
}
找到它!
查询中存在约束冲突,导致查询执行失败。它没有在异常中报告该信息,而是报告会话处于"终止状态"(我猜),因为查询提前终止。
我以前从未见过这种错误——通常情况下,约束错误在异常中更有用。
因此,任何收到此错误的人——请仔细检查您的查询,以确保其有效。
您的代码应该如下所示:
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,消息为'由于会话处于终止状态,无法继续执行'。。。