下面的代码执行一个简单的插入命令。 如果它被称为连续2000次(插入2000行)与消息的OleDbException =“系统资源超过”被抛出。 有别的我应该做的事,以腾出资源?
using (OleDbConnection conn = new OleDbConnection(connectionString))
using (OleDbCommand cmd = new OleDbCommand(commandText, conn))
{
conn.Open();
cmd.ExecuteNonQuery();
}
该系统的资源超过误差不会从托管代码来,它从你杀死你的数据库来(JET?)
您正在打开的方式很多连接,方法快...
一些技巧:
- 通过不打开为每一个命令一个新的连接避免往返,并使用单个连接执行插入。
- 确保数据库连接池的工作(不知道是否与OLEDB连接工程)。
- 考虑使用更加优化的方式来插入数据。
您是否尝试过这个?
using (OleDBConnection conn = new OleDBConnection(connstr))
{
while (IHaveData)
{
using (OldDBCommand cmd = new OldDBCommand())
{
cmd.Connection = conn;
cmd.ExecuteScalar();
}
}
}
我测试了这个代码不与Access 2007数据库,没有例外(我就高达13000插入)。
不过,我注意到的是,它是非常缓慢,因为要创建每次连接。 如果你把“使用(连接)”外循环,它会快得多。
除了上述(连接到数据库只有一次),我也想确保你关闭你的连接配置。 在C#的大多数对象的管理WRT存储,连接和流没有这种豪华始终,因此,如果这样的对象没有设置的,他们不能保证被清理。 这有离开打开你的程序的生命该连接的附加效果。
另外,如果可能的话,我会考虑使用事务。 我不能告诉你正在使用的这个代码,但插入和更新数据库中的许多行时OleDbTransactions是有用的。
我不知道具体细节,但我也碰到类似的问题跑了。 我们利用与IIS Access数据库服务于我们的客户。 我们没有很多的客户,但也有很多连接的单个会话期间被打开和关闭。 大约一个星期的工作后,我们收到了同样的错误,所有连接尝试失败。 要纠正这个问题,我们需要做的就是重新启动工作进程。
经过一番研究,我发现(当然),其访问不在这个环境中表现良好。 资源没有得到正确释放,并随着时间的推移可执行文件将用完。 为了解决这个问题,我们将移动到Oracle数据库。 如果不能解决这个问题,我将让你在我的调查结果更新。
这可以发生,因为你没有配置创建的连接和Command对象。 总是在处置结束的对象。
OledbCommand.Dispose();