You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 06:10:59