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.
Questo sembra essere un problema, ma non spiega tutti i problemi. –