2013-01-23 12 views
5

I Utilizzare Oledb di leggere un AccessFile (accdb) per DataSet, io non so i nomi delle tabelle o colonne, L'implementazione regolare è:Utilizzare OLE DB per leggere AccessFile da Stream per 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(); 
    } 
    } 
} 
} 

Ma Ho bisogno di ottenere il file di accesso da Stream, e non riesco a scriverlo sul disco temporaneo, quindi qual è il tuo suggerimento?

Mi serve Questo sovraccarico di GetAccessDB(Stream AccessFile)? Cerco e trova This, ma non è chiaro per me, ho bisogno di ottenere finalmente DataSet da tutte le tabelle in Access File.

Qualcuno sa di questo?

+0

Perché si desidera eseguire le operazioni sui dati in un file 'Access' aperto come flusso? Solo curioso. –

+0

@AlexFilipovici I client caricano il file di accesso E ho bisogno di leggerli e trovare i dati di destinazione e memorizzati su SQL e mostrare una tabella di dati di destinazione al client, ma non posso (qualche limitazione) scrivere i file sul disco! – Saeid

+0

come mai non si può fare il lavoro sul disco locale ..? per favore spiega meglio il tuo ragionamento in modo che gli altri possano capire e non guidarti lungo il sentiero d'oro come dicono – MethodMan

risposta

1

Se hai il controllo su MS SQL Server, questa è una buona notizia. Attualmente vedo 2 alternative:

  1. Creare un CLR asssembly che elaborerà (in modo asincrono è una buona idea) il file una volta l'inserto è realizzato nella tabella file caricati. Creerebbe un file temporaneo MS Access sul server utilizzando il contenuto del file caricato. Quindi, aprilo con OleDB, analizzalo e inserisci le informazioni da esso in una tabella SQL che mappa le informazioni estratte con il record di file caricato nella prima tabella. Quindi, potresti andare a cercare i dati in questa seconda tabella.

  2. Un'altra opzione sarebbe quella di inviare al SQL un comando che farà il seguente:

    1. Utilizzare i byte file caricato create a file on the filesystem.
    2. Quindi, utilizzare il file come un linked server
    3. Usa SELECT per interrogare il database di Access

Avrete notato che entrambe le opzioni comportano la creazione di un (almeno temporanea) file in SQL Server .

+0

Grazie Alex, lasciami provare. – Saeid

2

Non conosco alcuna funzione API in OleDb per il lavoro con i database in memoria. Forse, potresti installare un RAMDisk?

Problemi correlati