当前位置: 代码迷 >> C# >> C#往Access插入数据几千行后发生错误,"不能再打开其它表了"是什么原因啊
  详细解决方案

C#往Access插入数据几千行后发生错误,"不能再打开其它表了"是什么原因啊

热度:57   发布时间:2016-05-05 03:32:01.0
C#往Access插入数据几千行后发生异常,"不能再打开其它表了",是什么原因啊?
我往Access里插入数据,几千行后代码就抛出异常了,说不能再打开其他表了,我是循环着插入数据的,前面都好好的,中间就发生异常了,贴代码看看

 public void AddRecords(List<DbRecordData> list)
        {
            try
            {
                if (!m_dbAccess.IsOpen)
                {
                    m_dbAccess.Open();
                }
               
                foreach (DbRecordData record in list)
                {
                    StringBuilder sbselect = new StringBuilder();
                    StringBuilder sbinsert = new StringBuilder();
                    sbselect.AppendFormat("select * from ds_rtudatalog where rtu_id={0} and channel_id={1} and log_time='{2}' and data_name='{3}'",
                        record.RtuId, record.ChannalId, record.LogTime, record.DataName);
                    IDataReader rs = m_dbAccess.RsOpen(sbselect.ToString());

                    if (rs.Read())  // 读取到了数据
                    {
                        rs.Close();
                        continue;
                    }
                    rs.Close();

                    if (!rs.IsClosed)
                    {
                        rs.Close();
                    }
                    
                    sbinsert.AppendFormat("insert into ds_rtudatalog(rtu_id, channel_id, log_time, data_name, data_content) values({0}, {1}, '{2}', '{3}', '{4}')",
                        record.RtuId, record.ChannalId, record.LogTime, record.DataName, record.DataContent);
                    _log.DebugFormat("SQL={0}", sbinsert.ToString());

                    if (m_dbAccess.Execute(sbinsert.ToString()) <= 0)
                    {
                        m_project.TraceInfo("插入数据失败.");
                    }
                }
                m_dbAccess.Close();
            }
            catch (Exception e)
            {
                _log.Error("进入数据库异常catch分支");
                _log.Error(e.Message);  //就是这报的异常,"不能再打开其它表了"
            }
            finally
            {
                if (m_dbAccess.IsOpen)
                {
                    m_dbAccess.Close();
                }
            }
           
        }
------解决思路----------------------
你的
m_dbAccess.Close();
在foreach循环之外
估计是access一直打开,连接没释放造成的。

1、每次插入完,关闭连接
2、批量插入
------解决思路----------------------
看起来IDataReader rs 被释放了

m_dbAccess.Execute里面如何实现的?
------解决思路----------------------
我见过很多人封装的Execute函数,里面如果遇到错误就直接关闭基础连接

查看代码,看你的函数里是否也是这样做的.
------解决思路----------------------
google ”access 不能再打开其它表了“ 可以找到几个其他的,但是都没有解决fangan

google "C# access can't open any more tables" 找到下列的文章和讨论

看看这个能不能帮你:
http://access.mvps.org/access/bugs/bugs0010.htm

这里还有一个讨论:
MS Access - Can't Open Any More Tables
http://stackoverflow.com/questions/1807934/ms-access-cant-open-any-more-tables
------解决思路----------------------
调试(或者测试)时要把你的 catch{...} 代码去掉,才可能让调试器停在真正抛出异常的语句上。

你那种“就是这报的异常”的说法根本没有找到抛出异常的地方,这种写法让你丧失了真正的调试能力。面对不好好调试程序的人(在一个需要调试的程序上反而要纠结于catch{....}里边的代码有什么“异常”——已经晚了),也没有什么办法了。
  相关解决方案