Use OLEDB to read AccessFile from Stream to DataSet

☆樱花仙子☆ 提交于 2020-01-03 15:16:30

问题


I Use Oledb to read an AccessFile(.accdb) to DataSet, I don't know about table names or columns, The regular implementation is:

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();
    }
  }
}
}

But I need to get Access File from Stream, And I can't Write it on the Disk temporary, so what is your suggestion?

I need This overload of GetAccessDB(Stream AccessFile)? I search and find This, but that's not clear for me, I need finally get DataSet by all Tables in Access File.

Does any one know about this?


回答1:


If you have control over the MS SQL Server, that's good news. I currently see 2 alternatives:

  1. Create a CLR asssembly that will process (asynchronously is a good idea) the file once the insert is made in the uploaded files table. It would create a temporary MS Access file on the server by using the content of the uploaded file. Then, open it with OleDB, parse it and insert the information from it in a SQL table which maps the extracted information with the uploaded file record in the first table. Then, you could go and look for the data in this second table.

  2. Another option would be to send to the SQL a command which will do the following:

    1. Use the uploaded file bytes to create a file on the filesystem.
    2. Then, use the file as a linked server
    3. Use SELECT to query the Access database

You may have noticed that both options involve creating a (at least temporary) file on the SQL Server.




回答2:


I don't know any api function in OleDb for work with in-memory databases. Maybe, could you install a RAMDisk?



来源:https://stackoverflow.com/questions/14475561/use-oledb-to-read-accessfile-from-stream-to-dataset

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!