以下代码执行简单的插入命令。如果连续调用2000次(插入2,000行),则抛出一个带有message =“System Resources Exceeded”的OleDbException。我是否应该采取其他措施来释放资源?
using (OleDbConnection conn = new OleDbConnection(connectionString))
using (OleDbCommand cmd = new OleDbCommand(commandText, conn))
{
conn.Open();
cmd.ExecuteNonQuery();
}
答案 0 :(得分:5)
系统资源超出错误不是来自托管代码,它来自你杀死你的数据库(JET?)
你正在开辟许多联系,快速的方式...
一些提示:
你试过这个吗?
using (OleDBConnection conn = new OleDBConnection(connstr))
{
while (IHaveData)
{
using (OldDBCommand cmd = new OldDBCommand())
{
cmd.Connection = conn;
cmd.ExecuteScalar();
}
}
}
答案 1 :(得分:1)
我使用Access 2007数据库测试了此代码,没有例外(我高达13000次插入)。
但是,我注意到的是,每次创建连接时速度都非常慢。如果你把“使用(连接)”放在循环之外,它会更快。
答案 2 :(得分:0)
除了上述内容(仅连接数据库一次)之外,我还要确保您关闭并处理您的连接。由于c#中的大多数对象都是由内存管理的,因此连接和流总是没有这种奢侈,所以如果没有处理这样的对象,则不能保证它们被清除。这样可以在程序的生命周期内保持连接打开。
另外,如果可能的话,我会考虑使用交易。我无法分辨您使用此代码的内容,但OleDbTransactions在插入和更新数据库中的许多行时非常有用。
答案 3 :(得分:0)
我不确定具体细节,但我遇到了类似的问题。我们利用带有IIS的Access数据库为我们的客户提供服务。我们没有很多客户,但在单个会话期间有很多连接被打开和关闭。经过大约一周的工作,我们收到相同的错误,所有连接尝试都失败了。要纠正这个问题,我们所要做的就是重启工作进程。
经过一些研究,我发现(当然)Access在这种环境下表现不佳。资源无法正确释放,随着时间的推移,可执行文件将耗尽。为了解决这个问题,我们将转向Oracle数据库。如果这不能解决问题,我会及时向您通报我的发现。
答案 4 :(得分:-1)
这可能是因为您没有处理创建的Connection和Command对象。始终在最后处置对象。
OledbCommand.Dispose();