私が取り組んでいるプロジェクトには、MDB(acecssデータベース)ファイルが含まれています。テーブルの内容をテキストにエクスポートしたいのですが、C#を使用して簡単に行う方法を見つけるのが苦労しています。 OLEDBとクエリを使用するよりも速い方法がありますか?C#のテキストにMDBファイルのテーブルの内容を抽出するにはどうすればよいですか?
更新: 理想的には、静的に各テーブル(何百もある)の名前を付ける必要はなく、.NET 2.0以下を使用する必要があります。
私が取り組んでいるプロジェクトには、MDB(acecssデータベース)ファイルが含まれています。テーブルの内容をテキストにエクスポートしたいのですが、C#を使用して簡単に行う方法を見つけるのが苦労しています。 OLEDBとクエリを使用するよりも速い方法がありますか?C#のテキストにMDBファイルのテーブルの内容を抽出するにはどうすればよいですか?
更新: 理想的には、静的に各テーブル(何百もある)の名前を付ける必要はなく、.NET 2.0以下を使用する必要があります。
あり、より効率的な方法かもしれませんが、あなたは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());
気になる方法はありません。テーブルを繰り返し処理し、必要なテキスト形式(.csv、タブ区切りなど)でデータを吐き出すだけのものを書いてください。
あなたはいつもVBAの中でそれをAccessの中に書くことができますが、それが速くなるか遅くなるかはわかりません。
あなたが相互運用ルートを移動したい場合は、アクセスに、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;
}
うわー - これは存在しないと思っていた。 – RQDQ
私は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);
}
}
OleDbDataReaderは高速ではありません。ストレート( "SELECT * FROM [Table]")クエリは非常に高速で、ディスクの読み取りおよび/またはネットワーク速度によってのみ制限されます。 –
これはコードで行う必要がありますか?テーブルをAccessのテキストファイルにエクスポートするオプションがあります。 –