使用OLEDB将AccessFile从Stream读取到DataSet

我使用Oledb读取AccessFile(.accdb)到DataSet,我不知道表名或列,常规实现是:

public void GetAccessDB(string filepath){ this.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source = " + filepath; // get Table Names this.TableNames = new List(); using (System.Data.OleDb.OleDbConnection oledbConnection = new System.Data.OleDb.OleDbConnection(this.ConnectionString)) { oledbConnection.Open(); System.Data.DataTable dt = null; dt = oledbConnection.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, null); foreach (System.Data.DataRow row in dt.Rows) { string strSheetTableName = row["TABLE_NAME"].ToString(); if (row["TABLE_TYPE"].ToString() == "TABLE") this.TableNames.Add(strSheetTableName); } oledbConnection.Close(); } this.Dataset = new System.Data.DataSet(); using (System.Data.OleDb.OleDbConnection oledbConnection = new System.Data.OleDb.OleDbConnection(this.ConnectionString)) { foreach (string table in this.TableNames) { string command = string.Format("SELECT * FROM {0};", table); using (System.Data.OleDb.OleDbCommand cmd = new System.Data.OleDb.OleDbCommand(command, oledbConnection)) { cmd.CommandType = System.Data.CommandType.Text; oledbConnection.Open(); System.Data.OleDb.OleDbDataReader dr = cmd.ExecuteReader(); this.Dataset.Load(dr, System.Data.LoadOption.OverwriteChanges, table); oledbConnection.Close(); } } } } 

但是我需要从Stream获取Access文件,而且我暂时不能将它写在磁盘上,那你的建议是什么?

我需要GetAccessDB(Stream AccessFile)这个重载? 我搜索并找到了这个 ,但这对我来说并不清楚,我最终需要通过Access File中的所有表获取DataSet。

有人知道吗?

如果您可以控制MS SQL Server ,这是个好消息。 我目前看到两种选择:

  1. 创建一个CLR组件 ,一旦在上传的文件表中进行插入,它将处理(异步是一个好主意)文件。 它将使用上载文件的内容在服务器上创建临时MS Access文件。 然后,使用OleDB打开它,解析它并将其中的信息插入到SQL表中,该表将提取的信息与第一个表中的上载文件记录进行映射。 然后,您可以在第二个表中查找数据。

  2. 另一个选择是向SQL发送一个命令,该命令将执行以下操作:

    1. 使用上载的文件字节在文件系统上创建文件 。
    2. 然后,将该文件用作链接服务器
    3. 使用SELECT查询Access数据库

您可能已经注意到这两个选项都涉及在SQL Server上创建(至少是临时的)文件。

我不知道OleDb中的任何api函数用于内存数据库。 也许,你能安装一个RAMDisk吗?