【问题标题】:"Unspecified error" in sql that goes away after few seconds几秒钟后消失的 sql 中的“未指定错误”
【发布时间】:2012-09-25 08:31:10
【问题描述】:

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

很奇怪,我让每个 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 适配器出错。

【问题讨论】:

    标签: c# linq-to-sql


    【解决方案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;
        }
    }
    

    【讨论】:

    • 就是这样!故障一定是由于打开了如此多的同时连接而没有处理它们。谢谢!!
    猜你喜欢
    • 1970-01-01
    • 2021-05-12
    • 2013-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多