我往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{....}里边的代码有什么“异常”——已经晚了),也没有什么办法了。