2012-02-08 12 views
1

2500カラムと2000行のデータテーブルがあります。 OLEDBを使用してエクスポートしようとすると、「あまりにも多くのフィールドが定義されています」というエラーが表示されます。私はExcel Inter Opを使うことはできません。もっと時間がかかるからです。この問題を解決する他の方法はありますか?OLEDBを使用してデータテーブルをExcelにエクスポートすると、フィールド数が多すぎます

using (OleDbConnection con = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + fileName + ";" + "Extended Properties=" + "\"" + "Excel 8.0;HDR=NO;" + "\"")) 
       { 
        con.Open(); 
        OleDbCommand cmdInsert; 
        if (createTable || !File.Exists(fileName)) 
        { 
         sql = "CREATE TABLE " + tableName + " ("; 
         for (int i = 0; i < tbl.Columns.Count; i++) 
         { 
          sql += "[" + tbl.Columns[i].ColumnName + "]"; 
          if (i + 1 == tbl.Columns.Count) //Here we decide should we close insert command or appebd another create column command 
           sql += " " + GetColumnType(tbl.Columns[i]) + ")"; //Close insert 
          else 
           sql += " " + GetColumnType(tbl.Columns[i]) + ","; //there is more columns to add 
         } 
        } 
        if (!String.IsNullOrEmpty(sql)) 
        { 
         cmdInsert = new OleDbCommand(sql, con); 
         cmdInsert.ExecuteNonQuery(); 
        } 
        foreach (DataRow row in tbl.Rows) 
        { 
         //Dodati parametre na comandu 
         string values = "("; 
         for (int i = 0; i < tbl.Columns.Count; i++) 
         { 
          if (i + 1 == tbl.Columns.Count) 
          { 
           if (tbl.Columns[i].DataType == System.Type.GetType("System.Decimal") || 
            tbl.Columns[i].DataType == System.Type.GetType("System.Int64") || 
            tbl.Columns[i].DataType == System.Type.GetType("System.Double")) 
            values += String.IsNullOrEmpty(row[i].ToString()) ? "0)" : Convert.ToDecimal(row[i]).ToString("#0.00", _infoEn) + ")"; 
           else 
            values += "'" + System.Security.SecurityElement.Escape(row[i].ToString()) + "')"; 

           //values += "'" + "test" + "')"; 
          } 
          else 
          { 
           if (tbl.Columns[i].DataType == System.Type.GetType("System.Decimal") || 
            tbl.Columns[i].DataType == System.Type.GetType("System.Int64") || 
            tbl.Columns[i].DataType == System.Type.GetType("System.Double")) 
            values += String.IsNullOrEmpty(row[i].ToString()) ? "0," : Convert.ToDecimal(row[i]).ToString("#0.00", _infoEn) + ","; 
           else 
            values += "'" + System.Security.SecurityElement.Escape(row[i].ToString()) + "',"; 

           //values += "'" + "test" + "',"; 
          } 
         } 
         string sqlInsert = String.Format("Insert into [{0}$] VALUES {1}", tableName, values); 
         cmdInsert = new OleDbCommand(sqlInsert, con); 

         cmdInsert.ExecuteNonQuery(); 
        } 
       } 

答えて

1

oledbの使用制限が255列であることがわかりました。したがって、私は

public void CreateCSVFile(System.Data.DataTable dt, out StringWriter stw) 
     { 
      stw = new StringWriter(); 
      int iColCount = dt.Columns.Count; 
      for (int i = 0; i < iColCount; i++) 
      { 
       stw.Write(dt.Columns[i]); 
       if (i < iColCount - 1) 
       { 
        stw.Write(","); 
       } 
      } 
      stw.Write(stw.NewLine); 
      foreach (DataRow dr in dt.Rows) 
      { 
       for (int i = 0; i < iColCount; i++) 
       { 
        if (!Convert.IsDBNull(dr[i])) 
        { 
         stw.Write(dr[i].ToString()); 
        } 
        if (i < iColCount - 1) 
        { 
         stw.Write(","); 
        } 
       } 
       stw.Write(stw.NewLine); 
      } 
     } 

が、今私はそれが文書化されて

+0

は、あなたが知っていますかエクスポート膨大なデータの問題を解決することができる午前HTTPページのレスポンスに以下のコードを使用して、それを書くcsvファイルにデータテーブルを変換していますOleDbでは列の最大数は255ですか?私は空の、しかし初期化された列の束を持っていたExcelワークシートからDataTableを充填する同様の問題に遭遇した。 – Jim

0

Excelには「テーブル」定義でサポートされている列の制限がありますか?それはあなたのボトルネックかもしれません。

私が示唆しているのは、テーブルを構築するときに、すべての列に対して行うことです。私はバッチサイクルでそれを実行することをお勧めします。関数を呼び出し、一度に100列を実行し、2行または3行のみをエクスポートします。したがって、すべての2000列を構築するには20回のループサイクルが必要ですが、そこではあなたの休憩を見つけるかもしれません。完全な2000列に達したら、エクスポートされている行を展開し、挿入されたROWに失敗したことを確認します。あなたのプロセスを殺すことにいくつかのNULL値が浮かんでいる可能性があります。

関連する問題