【问题标题】:Use OLEDB to read AccessFile from Stream to DataSet使用 OLEDB 从 Stream 读取 AccessFile 到 DataSet
【发布时间】:2013-01-06 16:29:29
【问题描述】:

我使用 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<string>();
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 中获取访问文件,并且我不能将它临时写入磁盘,所以你有什么建议?

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

有人知道吗?

【问题讨论】:

  • 为什么要在作为流打开的Access 文件中进行数据操作?只是好奇。
  • @AlexFilipovici 客户端上传访问文件,我需要读取它们并查找目标数据并存储在 SQL 上并向客户端显示目标数据表,但我不能(某些限制)写入文件到磁盘!
  • 你为什么不能在本地磁盘上工作..?请更好地解释你的推理,以便其他人能够理解而不是像他们所说的那样把你引向黄金之路
  • 数据库是否存储在 MS SQL Server 上?如果是,您可以控制哪个版本?
  • @AlexFilipovici SQL Server 2008,是的,我有任何控制权。

标签: c# c#-4.0 ms-access stream oledb


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    如果您可以控制MS SQL Server,那是个好消息。我目前看到 2 个替代方案:

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

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

      1. 使用上传的文件字节到create a file on the filesystem
      2. 然后,将该文件用作linked server
      3. 使用SELECT查询Access数据库

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-09
      • 1970-01-01
      • 1970-01-01
      • 2012-08-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多