1

xmlファイルに格納されているデータを取得し、linq-to-sqlを使用してMicrosoftAccessデータベースに送信するパーサーを作成しました。私はsql挿入コマンドを持っていますが、それらは機能します...機能しなくなるまで。

奇妙なことに、私は各SQLコマンドを実行し(リストに保持し、各コマンドを一度に1つずつ実行します)、最初の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;
    }

ACE.OLEDB.12.0アダプターでのエラーを回避するために、アプリケーションをX86モードで実行していることに注意してください。

4

1 に答える 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 に答える