c# + access
windows xp + NTFS
起初程序运行正常,可以insert和update,一段时间后(此时已经insert成功200次,update成功40次)所有涉及到insert和update的操作全部出现该异常:
未处理 System.Data.OleDb.OleDbException
  Message="操作必须使用一个可更新的查询。"
  Source="Microsoft JET Database Engine"
  ErrorCode=-2147467259在论坛上翻了一下帖子大多说是权限问题,我的这个应该不是权限的问题。另外:使用了多线程访问数据库,不知道有没有问题。

解决方案 »

  1.   

    access文件所在的目录 属性 安全 给everyone 写入的权限
    并且确定access文件不是 只读格式
      

  2.   

    “时好时坏”:准确的讲是,开始好的过会儿就变坏了。感谢:hertcloud(·£DOTNET@C/C++£·做个热心人) 的意见,不过好像帮不上忙每一次的操作用的对象都是一样的 可写的 前面打开的连接都关闭了
      

  3.   

    msdn上说,microsoft不建议使用本地多线程访问acess,尤其当本地线程达到15个以上时。
    于是我就想牺牲一下性能,串行访问数据库,不知道在多线程时以下的lock语句能不能达到并发控制的目的。
    我在所有的数据库访问函数里都加了lock (Lock_db),包括select。
    异常出现时一下弹出10几个对话框,是不是意味着我没能够实现并发控制?
        static class dbAcc
        {
            public static string connectionString = "provider=Microsoft.Jet.OLEDB.4.0;data source=#db.mdb";
            private static string Lock_db = "";        public static void addNew()
            {
                string myExecuteQuery = "insert或update语句";
                OleDbConnection myConnection = new OleDbConnection(connectionString);
                OleDbCommand myCommand = new OleDbCommand(myExecuteQuery, myConnection);
                try
                {
                    lock (Lock_db) //不知道可不可以
                    {
                        myCommand.Connection.Open();
                        myCommand.ExecuteNonQuery();                    
                    }
                }
                catch (OleDbException exp)
                {
    MessageBox.Show(exp.Message);
                }
                finally
                {
                    myConnection.Close();
                }
            }
      

  4.   

    我是这样丢弃重复记录的
                try
                {
                    lock (Lock_db)
                    {
                        myCommand.Connection.Open();
                        myCommand.ExecuteNonQuery();                    
                    }
                }
                catch (OleDbException exp)
                {
                    if (!exp.Message.Contains("创建重复的值") && !exp.Message.Contains("字段太小而不能接受所要添加的数据的数量"))
                        MessageBox.Show("dbAcc_addNew:"+exp.Message);
                }
      

  5.   

    finally
                {
                    myConnection.Close();
                }
      

  6.   

    可能就是上面的代码有问题,Lock语句没有把myConnection.Close();框在其中,我再试试。
      

  7.   

    应该是线程同步的问题...可以用一个Mutex..Mutex mx=new Mutex();在线程中需要调用AddNew方法时这样来用...for example://线程的过程方法中...
    mx.WaitOne();
    AddNew();
    mx.ReleaseMutex();
    试试看...
      

  8.   

    另外建议如果你的单CPU的话,就没有必要用多线程了...用多线程效率反而低...多线程一般用在多CPU条件下,这样才能发挥多线程的真正作用...