2012-03-28 14 views
0

私が取り組んでいるプロジェクトには、MDB(acecssデータベース)ファイルが含まれています。テーブルの内容をテキストにエクスポートしたいのですが、C#を使用して簡単に行う方法を見つけるのが苦労しています。 OLEDBとクエリを使用するよりも速い方法がありますか?C#のテキストにMDBファイルのテーブルの内容を抽出するにはどうすればよいですか?

更新: 理想的には、静的に各テーブル(何百もある)の名前を付ける必要はなく、.NET 2.0以下を使用する必要があります。

+0

OleDbDataReaderは高速ではありません。ストレート( "SELECT * FROM [Table]")クエリは非常に高速で、ディスクの読み取りおよび/またはネットワーク速度によってのみ制限されます。 –

+0

これはコードで行う必要がありますか?テーブルをAccessのテキストファイルにエクスポートするオプションがあります。 –

答えて

1

あり、より効率的な方法かもしれませんが、あなたはDataTableにデータを取り込むことができ、その後、テキストファイルにエクスポート:

DataTableにデータを取得:

string connString = "Provider=Microsoft.ACE.OLEDB.12.0;data source=C:\\marcelo.accdb"; 

DataTable results = new DataTable(); 

using(OleDbConnection conn = new OleDbConnection(connString)) 
{ 
    OleDbCommand cmd = new OleDbCommand("SELECT * FROM Clientes", conn); 
    conn.Open(); 
    OleDbDataAdapter adapter = new OleDbDataAdapter(cmd); 
    adapter.Fill(results); 
} 

DataTableをCSVにエクスポートする:

EDIT私はこれをテストしていませんが、このようなものは.NET 2.0で動作するはずです。

//initialize the strinbuilder 
StringBuilder sb = new StringBuilder();  

//append the columns to the header row 
string[] columns = new string[dt.Columns.Count - 1]; 
for (int i = 0; i < dt.Columns.Count; i++) 
    columns[i] = dt.Columns[i].ColumnName; 
sb.AppendLine(string.Join(",", columns));   

foreach (DataRow row in dt.Rows) 
{ 
    //append the data for each row in the table 
    string[] fields = new string[row.ItemArray.Length]; 
    for (int x = 0; x < myDataRow.ItemArray.Length; x++)   
     arr[x] = row[x].ToString();     
    sb.AppendLine(string.Join(",", fields)); 
} 

File.WriteAllText("test.csv", sb.ToString()); 
+0

大規模なデータセットをサポートするためには、リーダーの使用をお勧めします。 – RQDQ

+0

@RQDQ:それはOPのための良いアドバイスです。これは、そのコンセプトを実証するための簡単な例でした。 –

+0

良いアイデア - しかし、私はそれが.NET 2.0特有のものであると言わざるを得ない。私は列名のコードのリンクを参照してください。 :( – Darkenor

2

気になる方法はありません。テーブルを繰り返し処理し、必要なテキスト形式(.csv、タブ区切りなど)でデータを吐き出すだけのものを書いてください。

あなたはいつもVBAの中でそれをAccessの中に書くことができますが、それが速くなるか遅くなるかはわかりません。

+0

+1はVBAのアイデアです。 – Steve

+0

私が見る唯一の問題は、何百ものテーブルがあることです。理想的には、テーブルの名前を静的に指定する必要はなく、代わりにすべてのテーブルを行うようにしたいと思います。 – Darkenor

+0

私はプログラムでテーブルを取得すると仮定しました:http://stackoverflow.com/questions/201282/how-to-get-table-names-from-access – RQDQ

1

あなたが相互運用ルートを移動したい場合は、アクセスに、TransferTextメソッドで単一のコマンドでそれを行うことができます。

using Access = Microsoft.Office.Interop.Access; 
using System.Runtime.InteropServices; 

static void ExportToCsv(string databasePath, string tableName, string csvFile) { 
    Access.Application app = new Access.Application(); 
    app.OpenCurrentDatabase(databasePath); 
    Access.DoCmd doCmd = app.DoCmd; 
    doCmd.TransferText(Access.AcTextTransferType.acExportDelim, Type.Missing, tableName, csvFile, true); 
    app.CloseCurrentDatabase(); 
    Marshal.FinalReleaseComObject(doCmd); 
    doCmd = null; 
    app.Quit(); 
    Marshal.FinalReleaseComObject(app); 
    app = null; 
} 
+0

うわー - これは存在しないと思っていた。 – RQDQ

1

私はC#を知っているが、ここでもう一つのアイデアですませんが、かなり荒い。使用するMicrosoft.Office.Interop.Access.Dao

DBEngine dbEng = new DBEngine(); 
Workspace ws = dbEng.CreateWorkspace("", "admin", "", 
    WorkspaceTypeEnum.dbUseJet); 
Database db = ws.OpenDatabase("z:\\docs\\test.accdb", false, false, ""); 

foreach (TableDef tdf in db.TableDefs) 
{ 
    string tablename=tdf.Name; 
    if (tablename.Substring(0,4) != "MSys") 
    { 
     string sSQL = "SELECT * INTO [Text;FMT=Delimited;HDR=Yes;DATABASE=Z:\\Docs].[out_" 
      + tablename + ".csv] FROM " + tablename; 
     db.Execute(sSQL); 
    } 
} 
関連する問題