weixin_43386620 2019-06-02 21:56 采纳率: 50%
浏览 1247
已结题

如何解决c#操作Access数据库时出现的“无法更新,当前被锁定”问题

1.目前正在用c#写一个上位机软件,需要每隔10秒备份一次数据,将数据写入一个名为“SpeedDB.mdb”的Access数据中。上位机软件与下位机通过tcp连接,单独使用了一个线程来进行每隔10秒的数据备份,程序第一次启动时运行没问题,当tcp连接断开后终止此线程,重新连接后再实例化并启动此线程,此时便会出现这个异常,提示“无法更新,当前被锁定”。同时还会导致整个程序其它操作变卡。

2.代码如下:
(1)每次tcp连接上时会实例化并启动数据备份的线程

SpeedDBThread = new Thread(new ThreadStart(AddSpeedDB)) 
{
   IsBackground = true        
};//实例化转速备份线程

SpeedDBThread.Start();          //启动转速备份线程

(2)数据备份的函数如下:

private void AddSpeedDB()
        {
            OleDbConnection ODbCon = new OleDbConnection("Provider = Microsoft.Jet.OLEDB.4.0;Data Source = D:\\SpeedDB.mdb");   //用连接字符串初始化OleDbConnection的实例对象ODbCon
            while (true)    
            {
                if(tcpClient != null && tcpClient.Connected == true)    //仅在连接时备份
                {
                    try
                    {
                        ODbCon.Open();      //调用Open方法打开数据库连接
                        string TimeStr = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");  //获取此次转速备份的时间

                        //写入数据
                        for (UInt16 JDZ_NUM = 1; JDZ_NUM <= 12; JDZ_NUM++)
                        {
                            for (UInt16 ZJ_NUM = 1; ZJ_NUM <= 20; ZJ_NUM++)
                            {
                                for (UInt16 JQ_NUM = 1; JQ_NUM <= 20; JQ_NUM++)
                                {
                                    OleDbCommand AddRecordCommand = new OleDbCommand()
                                    {
                                        Connection = ODbCon
                                    };
                                    if (AllSpeed_NormalMsg[JDZ_NUM - 1, ZJ_NUM - 1].uFrame != 0)
                                    {
                                        AddRecordCommand.CommandText = string.Format(DataBase.SpeedInfo_InsertStr, TimeStr,
                                            (AllSpeed_NormalMsg[JDZ_NUM - 1, ZJ_NUM - 1].uGroup - 1) * 400 +
                                            (AllSpeed_NormalMsg[JDZ_NUM - 1, ZJ_NUM - 1].uFrame - 1) * 20 + JQ_NUM,
                                            AllSpeed_NormalMsg[JDZ_NUM - 1, ZJ_NUM - 1].Info[JQ_NUM - 1].uSpeed);
                                        AddRecordCommand.ExecuteNonQuery();
                                    }
                                    else
                                    {
                                        AddRecordCommand.CommandText = string.Format(DataBase.SpeedInfo_InsertStr, TimeStr,
                                            (JDZ_NUM - 1) * 400 + (ZJ_NUM - 1) * 20 + JQ_NUM, 9.99);
                                        AddRecordCommand.ExecuteNonQuery();
                                    }
                                }
                            }
                        }
                        Thread.Sleep(1000);
                        ODbCon.Close();     //关闭数据库连接
                        Thread.Sleep(9000);
                    }
                    catch (Exception ex)
                    {
                        //异常提示
                        Current_Inform.Items.Insert(0, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "转速备份异常:" + ex.Message);
                        SpeedDBThread.Start();
                    }
                }
                else
                {
                    ODbCon.Close();
                    SpeedDBThread.Abort();  //无连接时终止线程
                    Thread.Sleep(1);

                }


            }
        }

3.可以看到代码里面都确定每次打开数据库连接最后都用ODbCon.Close();关闭了,但还是会有这个问题,我尝试过在捕获的异常处理中重启这个线程,代码如下:

catch (Exception ex)
                    {
                        //异常提示
                        Current_Inform.Items.Insert(0, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "转速备份异常:" + ex.Message);
                        ODbCon.Close();     //关闭数据库连接
                        GC.Collect();
                        Thread.Sleep(1);
                        SpeedDBThread.Abort();  //先终止此线程
                        Thread.Sleep(3000);

                        //重启线程
                        SpeedDBThread = new Thread(new ThreadStart(AddSpeedDB))             //实例化转速备份线程
                        {
                            IsBackground = true        //设置为后台线程
                        };
                        SpeedDBThread.Start();
                    }

还是会出现问题,并且会有新的异常提示“正在终止线程”。

目前很急,希望各位大佬看看能不能解决这个问题,拜托了!

  • 写回答

3条回答 默认 最新

  • dabocaiqq 2019-06-03 11:15
    关注
    评论

报告相同问题?

悬赏问题

  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮