1

我构建了一个解析器,它获取存储在 xml 文件中的数据并使用 linq-to-sql 将其发送到 Microsoft Access 数据库。我有 sql insert 命令并且它们可以工作......直到它们没有。

奇怪的是,我运行了每个 SQL 命令(我将它们保存在一个列表中并一次执行每个命令)并且前 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 适配器出现错误。

4

1 回答 1

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;
    }
}
于 2012-09-25T00:31:10.217 回答