sql中的“未指定的错误”在几秒钟后消失

时间:2012-09-25 00:17:08

标签: c# linq-to-sql

我构建了一个解析器,它使用存储在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适配器出错。

1 个答案:

答案 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;
    }
}