我构建了一个解析器,它使用存储在xml文件中的数据,并使用linq-to-sql将其发送到Microsoft Access数据库。我有sql insert命令,它们可以工作......直到它们没有。
奇怪的是,我运行了每个SQL命令(我将它们保存在List中并一次执行一个命令),前40个左右运行正常,直到它们开始出现“未指定的错误”。问题是,如果我吞下异常,而异常捕手继续重试,几秒钟后,他们再次开始工作。这意味着它不是SQL查询本身的错误(或者至少是它的编写方式)。
这种模式多次重复(有数千个插入)。如果我进行正常的异常处理,程序将在错误发生时跳过几条记录,并在任何导致它暂时消失的情况下继续插入。如果我让它运行它的过程,它会插入一些记录,跳过一些,插入,跳过,重复并最终插入少于2/3的记录。
为什么我的计算机只能运行40个左右的插入,然后拒绝以随机但短暂的间隔运行更多,是否有任何理由?
我对可能造成这种情况的原因感到茫然。
该应用程序是本地运行的;它不使用任何服务器/ Web通信,我在查找“未指定的错误”时发现的只是指向ADO.NET应用程序中的事件。
以下是错误发生的代码:
public static string insertQuery(string sql)
{
string connetionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Documents and Settings\Owner\Desktop\Arbeit\TrademarkParserproject1\TrademarkParserproject\bin\x86\Debug\Database.accdb";
OleDbConnection connection;
OleDbDataAdapter oledbAdapter = new OleDbDataAdapter();
connection = new OleDbConnection(connetionString);
string success = "false";
try
{
connection.Open();
oledbAdapter.InsertCommand = new OleDbCommand(sql, connection);
oledbAdapter.InsertCommand.ExecuteNonQuery();
}
catch (Exception ex)
{
success = ex.ToString();
return success;
}
success = "true";
return success;
}
注意,我让应用程序在X86模式下运行,以避免ACE.OLEDB.12.0适配器出错。
答案 0 :(得分:1)
有一点很突出,你永远不会关闭/处置你的SqlConnection。 OleDbDataAdapter也是一次性的,应该处理掉。 'using'语句是一个方便的构造:
public static string insertQuery(string sql)
{
string connetionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Documents and Settings\Owner\Desktop\Arbeit\TrademarkParserproject1\TrademarkParserproject\bin\x86\Debug\Database.accdb";
using(var oledbAdapter = new OleDbDataAdapter())
using(var connection = new OleDbConnection(connetionString))
{
string success = "false";
try
{
connection.Open();
oledbAdapter.InsertCommand = new OleDbCommand(sql, connection);
oledbAdapter.InsertCommand.ExecuteNonQuery();
}
catch (Exception ex)
{
success = ex.ToString();
return success;
}
success = "true";
return success;
}
}