问题
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:
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 withOleDB
, 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.Another option would be to send to the SQL a command which will do the following:
- Use the uploaded file bytes to create a file on the filesystem.
- Then, use the file as a linked server
- 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