C#执行SQL插入触发ExecuteReader事务错误,求解决方案
解决C# SQL插入操作的事务错误问题
核心修改点:
用ExecuteNonQuery替代ExecuteReader
你执行的是INSERT插入语句,不需要读取结果集,ExecuteReader()是专门用来执行SELECT这类需要返回查询结果的命令。执行插入、更新、删除操作,正确的方法是ExecuteNonQuery(),它会返回受影响的行数,这是触发当前错误的主要原因。处理事务关联(如果连接已开启事务)
错误提示说明你的geologyConnection已经处于一个未完成的本地事务中(比如之前调用过BeginTransaction()但没提交/回滚)。这种情况下,必须把SqlCommand的Transaction属性绑定到对应的事务对象:// 假设你之前开启了事务 SqlTransaction transaction = geologyConnection.BeginTransaction(); // 创建命令时关联事务 command = new SqlCommand(insertdb, geologyConnection, transaction);如果不需要事务,确保连接没有未处理的事务,可在代码开头检查并清理:
if (geologyConnection.State == ConnectionState.Open && geologyConnection.Transaction != null) { geologyConnection.Transaction.Commit(); // 或根据需求回滚 }用using语句管理资源
为避免资源泄漏,建议用using包裹SqlCommand,确保它被自动释放。
修改后的完整代码示例
List<string> tableExtractDB = new List<string>(); SqlTransaction transaction = null; try { // 确保连接处于打开状态 if (geologyConnection.State != ConnectionState.Open) { geologyConnection.Open(); } // 如需事务,取消下面注释(根据业务需求决定是否开启) // transaction = geologyConnection.BeginTransaction(); for (int i = 0; i < validationResultObj.siTableExtract.Count; i++) { List<string> tableExtract = new List<string>(); for (int j = 0; j < validationResultObj.siTableExtract[i].Count; j++) { tableExtract.Add(validationResultObj.siTableExtract[i][j].ToString()); } tableExtractDB = CheckDatabase(tableExtract, createdBy); foreach (string insertdb in tableExtractDB) { Console.WriteLine(insertdb); using (SqlCommand command = new SqlCommand(insertdb, geologyConnection)) { // 若开启了事务,绑定到命令 // if (transaction != null) // { // command.Transaction = transaction; // } command.ExecuteNonQuery(); } } } // 开启事务的话,执行完成后提交 // if (transaction != null) // { // transaction.Commit(); // } } catch (Exception ex) { // 出错时回滚事务(如果开启了) if (transaction != null) { transaction.Rollback(); } Console.WriteLine("插入失败:" + ex.Message); throw; } finally { // 最后关闭连接 if (geologyConnection.State == ConnectionState.Open) { geologyConnection.Close(); } }
内容的提问来源于stack exchange,提问作者Jin Hong
相关产品推荐
相关产品推荐

