2009-03-30 11 views
6

Come parte di un progetto su cui sto lavorando in C#, è necessario leggere un file .dbf. La prima cosa che voglio fare è ottenere la tabella dello schema dal file. Ho un codice che funziona fintanto che il nome del file (senza l'estensione) non è più lungo di 8 caratteri.Come utilizzare il metodo GetOleDbSchemaTable su un nome lungo file dbf

Ad esempio, supponiamo di avere un file denominato MyLongFilename.dbf. Il seguente codice non funziona; getta la seguente eccezione: "Il motore di database Microsoft Jet non è riuscito a trovare l'oggetto" MyLongFilename ". Assicurarsi che l'oggetto esista e che si scrive il suo nome e il nome di percorso correttamente.”

string cxn = "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=C:\MyLongFilename;Extended Properties=dBASE 5.0"; 
OleDbConnection connection = new OleDbConnection(cxn); 

Per superare questa eccezione, il passo successivo è quello di utilizzare un nome del OldDbConnection piace ('MyLongF ~ 1' al posto di 'MyLongFilename'), che porta a questo:

string cxn = "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=C:\MyLongF~1;Extended Properties=dBASE 5.0"; 
OleDbConnection connection = new OleDbConnection(cxn); 

questo fa ritorno con successo un OleDbConnection. Ora per ottenere la tabella dello schema, provo quanto segue:

connection.Open(); 
DataTable schemaTable = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, 
    new object[] { null, null, fileNameNoExt, null }); 

Questo restituisce un DataTable senza righe. Se rinominare il nome del file con 8 o meno caratteri, questo codice funziona e ritorno a una riga per ogni campo nel database.

Con il nome lungo, so che il collegamento restituito è valido perché posso usarlo per riempire un DataSet in questo modo:

string selectQuery = "SELECT * FROM [MyLongF~1#DBF];"; 
OleDbCommand command = new OleDbCommand(selectQuery, connection); 
connection.Open(); 
OleDbDataAdapter dataAdapter = new OleDbDataAdapter(); 
dataAdapter.SelectCommand = command; 
DataSet dataSet = new DataSet(); 
dataAdapter.Fill(dataSet); 

Questo mi restituisce un DataSet che contiene un DataTable con tutti i dati da il file dbf.

Quindi la domanda è: come posso ottenere solo la tabella dello schema per il file dbf denominato long? Ovviamente posso aggirare il problema rinominando/copiando il file, ma è un trucco che non voglio fare. Né voglio riempire il DataSet con il primo record e dedurre lo schema dalle colonne.

risposta

1

Beh, credo che il collegamento dovrebbe essere

string cxn = "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=C:\;Extended Properties=dBASE 5.0"; 
OleDbConnection connection = new OleDbConnection(cxn); 

e l'altro è, forse si dovrebbe provare con altri provider, ho potenziato molto lungo fa, quando ho usato in questo modo:

string cxn = "PROVIDER=VFPOLEDB.1;Data Source=C:\;Extended Properties=dBASE 5.0"; 

Ma si dovrebbe avere VFP 7 installato

o install Microsoft OLE DB Provider for Visual FoxPro 9.0 from here

 const string connectionString = @"Provider = vfpoledb; Data Source = {0}; Collating Sequence = general;"; 
     OleDbConnection conn = new OleDbConnection(string.Format(connectionString, dirName)); 
     conn.Open(); 
     OleDbCommand cmd = new OleDbCommand(string.Format("select * from {0}", fileName), conn); 
0

È fileNameNoExt che contiene la versione del nome breve del file? Inoltre, MyLongF ~ 1 è 9 caratteri, non 8.

2

Secondo MSDN, la cartella rappresenta il database ei file rappresentano le tabelle. Dovresti utilizzare il percorso della directory che non include il nome file nella stringa di connessione e il nome della tabella come parte delle restrizioni su GetOleDbSchemaTable.

+0

Questo sembra essere un problema, ma non spiega tutti i problemi. –

0

Se si dispone di un file dbf singolo (e possibilmente piccolo) è possibile risolvere il problema copiando il file dbf altrove e aprire la copia anziché il file originale.

0

Credo che DataSource dovrebbe rappresentare la directory che contiene i file .DBF. Ogni .Il file DBF corrisponde a una tabella in quella directory.

La mia ipotesi è C: \ MyLongF ~ 1 è un nome breve per una directory che contiene il nome del file corrispondente al MyLongF ~ 1 # DBF

è possibile verificare se questo è il caso?

Problemi correlati