【问题标题】:How can I extract an MDB file's table contents to text in C#?如何将 MDB 文件的表内容提取为 C# 中的文本?
【发布时间】:2012-04-12 04:06:32
【问题描述】:

我正在处理的一个项目包含一个 MDB(acecss 数据库)文件。我想将表格的内容导出为文本,但很难找到使用 C# 轻松完成此操作的方法。有没有比使用 OLEDB 和查询更快的方法?

更新: 理想情况下,我不想静态命名每个表(有数百个),我必须使用 .NET 2.0 或更低版本。

【问题讨论】:

  • OleDbDataReader 怎么不快?直接 ("SELECT * FROM [Table]") 查询非常快,仅受磁盘读取和/或网络速度的限制。
  • 这需要在代码中完成吗?在 Access 中有一个将表格导出到文本文件的选项。

标签: c# ms-access


【解决方案1】:

没有想到明显的方法。只需编写一些迭代表格的内容并以您想要的任何文本格式(.csv、制表符分隔等)输出数据。

您总是可以在 Access 中用 VBA 编写它,但我不知道这样会使其更快还是更慢。

【讨论】:

  • 我看到的唯一问题是有数百个表。理想情况下,我希望不必静态命名表,而是将它们全部完成。
  • 我以为你会以编程方式获取表格:stackoverflow.com/questions/201282/…
【解决方案2】:

可能有更有效的方法,但您可以将数据填充到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:

编辑我没有对此进行测试,但这样的东西应该适用于 .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());

【讨论】:

  • @RQDQ:这对 OP 来说是个好建议。这只是一个演示概念的简单示例。
  • 好主意 - 但我应该提到它是特定于 .NET 2.0 的。我在列名代码中看到了链接。 :(
【解决方案3】:

如果您想走 Interop 路线,您可以使用 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;
}

【讨论】:

  • 哇 - 不知道这存在。不错!
【解决方案4】:

我不懂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);
     }
 }

【讨论】:

    猜你喜欢
    • 2017-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-30
    • 2012-10-12
    • 2016-04-18
    • 2015-06-24
    相关资源
    最近更新 更多