2012-10-23 1 views
6

データセットからExcelスプレッドシートにデータを書き込む際にタイムアウトの問題が発生しています。現在、接続文字列は次のとおりです。データアダプタのアップデートを使用した.NETでのACEタイムアウト付き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="/> 

[接続タイムアウト]プロパティはプロバイダによってサポートされていないようです。接続タイムアウト、タイムアウト、ConnectionTimeout、ConnectTimeoutなどもありません。私のコードはデータアダプタとInsertCommandを作成し、データセットから更新しました。これは、Updateコマンド自体がデフォルトのOleDbタイムアウトである15秒以上かかる場合を除き、うまく動作します。その理由は、私は接続文字列でそれを設定しようとしている。私は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プロパティは読み取り専用で、プロバイダーが....

感謝をどうするか、接続文字列でタイムアウトをサポートしていないようだからです。

+0

ちょうど余分なものとして、チェックアウトopenxml、それはExcelシートでも非常に素晴らしい仕事をしている非常に大きなExcelシート – kunjee

答えて

1

ここでは私のアイデアがあります:

  • あなたが実際のAppSettingとしてこれを使用していないのconnectionStrings?あなたはのconnectionStringsとしてそれを使用している場合は、このチェックアウト:Escape quote in web.config connection string
  • データソースはそれを指摘し、その値が欠落していますが、コード
  • の一部を残しているため、あなたの問題の原因は、あなたのセッション・プーリングのタイムアウトかもしれません設定:INFO: OLE DB Session Pooling Timeout Configuration
  • 接続、アダプタ、およびコマンド作成行にステートメントを使用すると、蒸気ロックのフォームが作成され、タイムアウトが発生する可能性があります。
  • タイムアウトで、「スプレッドシートがいっぱいです」というエラーではありませんか? 〜1:50の後に完了するコードはここにあります.400,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(); 
    } 
    
関連する問題