2

私は C# でプログラミングし、oledbconnection. これは標準の接続文字列です。

using (OleDbConnection conn = new OleDbConnection(
          "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" +
           saveFilenameAndLocation + 
          ";Extended Properties='Excel 12.0 Xml;HDR=Yes'"
      ))  

行数が過剰でない場合、これは正常に機能し、正しいデータでいっぱいの Excel スプレッドシートが作成されます。ただし、スプレッドシートの行数が大きくなるたびに (たとえば、現在 166,110 行で失敗している)、ワークシートのタブ名が に設定された空のスプレッドシートが生成されA266FF2A662E84b639DAます。

接続を使用しないようにこれを書き直すことはできませOLEDBん。行サイズが大きくなると機能しない理由はありますか?

4

5 に答える 5

5

お使いのアプリケーション環境についてはわかりませんが、ASP.NET アプリから Excel ファイルを生成するときにこれを確認しました。

データ量が一定のサイズ (私の経験では ~1 MB) を超えると、プロバイダーは出力の生成中に一時ファイルの作成を試みます。64 ビット システムで 32 ビット プロバイダーを使用すると、この問題に遭遇しました。この構成のサービス アカウントで実行している場合、これらのファイルが作成される場所は次のとおりです。

C:\Windows\SysWOW64\config\systemprofile\AppData\Local\Microsoft\Windows\Temporary Internet Files\Content.MSO

ただし、この場所はデフォルトでしかアクセスadministratorsできません。プロバイダーが特権のないアカウントで実行されていて、一時ファイルを作成できないSYSTEM場合、プロバイダーはサイレントに失敗し、デフォルトの「空のファイル」をワークシートと共に返します。A266FF2A662E84b639DA

実行するアプリケーションのアカウント (ネットワーク サービスや IIS AppPool\ など) に、パス " " に沿ってコンテンツの読み取り/実行/一覧表示のアクセス許可を付与し、フォルダー自体C:\Windows\SysWOW64\config\systemprofile\AppData\Local\Microsoft\Windows\Temporary Internet Filesへのフル アクセスを許可する必要があります。Content.MSO

プロバイダーがシステムのビット数と一致する場合は、C:\Windows\System32\config\systemprofile\AppData\Local\Microsoft\Windows\Temporary Internet Files\Content.MSO代わりに上記のプロセスを実行する必要があると思いますが、これをテストしたことはありません.

この問題のトラブルシューティングに役立つsysinternals情報を提供してくれた に感謝します。procmon

于 2013-01-31T19:34:18.400 に答える
0

10時間後、私は解決策を見つけました。

1000 行ごとに、接続を閉じて再度開く必要があります。

サンプルはこちら。

string createTable = "Create Table [Sheet_X] (field1 char(255), field2 char(255),field3 char(255));";
OleDbCommand cmd = new OleDbCommand(createTable, conn);
conn.Open();
cmd.ExecuteNonQuery();
var counter = 0;
foreach (var item in items)
{
    if (conn.State == ConnectionState.Closed)
        conn.Open();
    string insertdata = "insert into [Sheet_X] (field1,field2,field3) values('value1','value2','value3');";
    counter++;
    if (counter >= 1000)
    {
        counter = 0;
        conn.Close();
    }
}
于 2016-04-22T18:11:06.790 に答える
0

今日、私の会社の従業員の 1 人がこの問題に遭遇しました。解決策は簡単でした。C: に 20MB の空き容量しか残っていませんでした。システム ドライブに十分な空き容量を確保すれば、問題は解決するはずです。

于 2014-09-15T14:42:20.580 に答える