6

データセットから Excel スプレッドシートへのデータの書き込みでタイムアウトの問題が発生しています。現在の接続文字列は次のとおりです。

<add key="ExcelConnectionStringHeader" value="Provider=Microsoft.ACE.OLEDB.12.0;Connect Timeout=30;Extended Properties=&quot;Excel 12.0;HDR=YES&quot;;Data Source="/>

Connect Timeout プロパティがプロバイダーでサポートされていないようです。Connection Timeout、Timeout、ConnectionTimeout、ConnectTimeout なども同様です。私のコードは、Data Adapter と InsertCommand を作成し、データセットから更新します。これは、Update コマンド自体が 15 秒 (デフォルトの OleDb タイムアウト) を超えない限り、うまく機能します。そのため、接続文字列に設定しようとしています。CommandTimeout をデフォルトの 30 から増やしましたが、それはまったく関係ありません。以下は私のコードです:

        OleDbDataAdapter da = new OleDbDataAdapter(szHeaderSelect, oCnn); // Ratings_Test -- Loan_Test$A1:F1]",
        DataSet dsTest = new DataSet();

        da.InsertCommand = new OleDbCommand(szNewSQL + "(" + szColumns + ") " + "VALUES ( " + szParams + ")", oCnn);
        da.InsertCommand.CommandTimeout = 300;


        foreach (DataRow oDr in dtTable.Rows)
        {

            drNew = dsTest.Tables[0].NewRow();

            dsTest.Tables[0].Rows.Add(drNew);
        }

        var timer = new System.Diagnostics.Stopwatch();
        timer.Start();
        var recs = da.Update(dsTest, szExcelTab); // Ratings_Test           }
        timer.Stop();

実際に挿入コマンドのコンテンツとパラメーターを構築するループなどは省略しました。私を信じてください、それはすべてうまくいきます。2200 以上のレコードが正常に動作します。

問題がタイムアウトであることを発見したのは、タイマーを追加した後でした。2221 レコードを処理する場合、14.95 秒かかり、スプレッドシートに問題なく表示されます。2260 レコードを処理する場合、15.21 秒かかり、何も表示されません。いかなる種類のエラーもありません。すべての行の更新後に行の状態を確認しましたが、すべて失敗していません。

結論として、ConnectionTimeout プロパティは ReadOnly であり、プロバイダーは接続文字列でタイムアウトをサポートしていないようです。どうすればよいでしょうか....

ありがとう。

4

2 に答える 2

1

これが私の考えです:

  • これを実際にconnectionStringsではなくappSettingとして使用していますか?これをconnectionStringsとして使用している場合は、次を確認してください。web.config接続文字列で引用符をエスケープします。
  • データソースに値がありません。コードのその部分を省略したため、データソースを指摘するだけです。
  • 問題の原因は、セッションプーリングタイムアウト設定である可能性があります。情報:OLEDBセッションプーリングタイムアウト構成
  • 接続、アダプター、およびコマンド作成行の前後にusingステートメントを配置する必要があります。これを行わないと、ベーパーロックの形式が作成され、タイムアウトが強制される可能性があります。
  • タイムアウトであり、「スプレッドシートがいっぱい」のエラーではありませんか?これが約1:50の後に完了する私のコードです。4,000,000行まで増やすと、「スプレッドシートがいっぱいです」というメッセージが表示されます。〜4:50以降のエラー:

    static void Main(string[] args)
    {
        var timer = new System.Diagnostics.Stopwatch();
    
        try
        {
            string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=\"Excel 12.0;HDR=YES;\";Data Source=Book1.xlsx";
    
            using (OleDbConnection oleDbConnection = new OleDbConnection(connectionString))
            {
                oleDbConnection.Open();
    
                string szHeaderSelect = "SELECT [A1] FROM  from [Sheet1$]";
                using (OleDbDataAdapter da = new OleDbDataAdapter(szHeaderSelect, oleDbConnection))
                {
                    using (da.InsertCommand = new OleDbCommand("INSERT INTO [Sheet1$] ( [A1] ) VALUES (?)",
                        oleDbConnection))
                    {
                        da.InsertCommand.Parameters.Add("A1", OleDbType.Integer, 20, "[A1]");
    
                        List<int> testData = new List<int>();
                        for (int i = 1; i < 400000; i++)
                        {
                            testData.Add(i);
                        }
    
                        DataSet dsTest = new DataSet();
                        dsTest.Tables.Add("[Sheet1$]");
                        dsTest.Tables[0].Columns.Add("[A1]");
    
                        foreach (int number in testData)
                        {
                            DataRow drNew = dsTest.Tables[0].NewRow();
                            drNew["[A1]"] = number;
    
                            dsTest.Tables[0].Rows.Add(drNew);
                        }
    
                        timer.Start();
                        var recs = da.Update(dsTest, "[Sheet1$]");
                    }
                }
            }
        }
        catch (Exception ex)
        {
            Console.Out.WriteLine(ex.Message);
        }
        finally
        {
            timer.Stop();
    
            Console.WriteLine(timer.Elapsed);
        }
    
        // Don't close before I get to read the results
        Console.WriteLine();
        Console.WriteLine("Press Enter to quit.");
        Console.ReadLine();
    }
    
于 2012-10-25T17:39:53.983 に答える
-2

アプリケーション プール アカウントを "LocalSystem" またはマシン管理者に設定します。

于 2015-07-21T19:03:16.420 に答える