2009-03-30 8 views
6

Como parte de un proyecto que estoy trabajando en C#, necesito leer en un archivo .dbf. Lo primero que quiero hacer es obtener la tabla de esquema del archivo. Tengo un código que funciona siempre que el nombre del archivo (sin la extensión) no tenga más de 8 caracteres.Cómo usar el método GetOleDbSchemaTable en un archivo dbf de nombre largo

Por ejemplo, supongamos que tengo un archivo llamado MyLongFilename.dbf. El siguiente código no funciona; arroja la siguiente excepción: "El motor de base de datos Microsoft Jet no pudo encontrar el objeto 'MyLongFilename'. Asegúrese de que el objeto existe y que ha escrito su nombre y el nombre de la ruta correcta.”

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

para superar esta excepción, el siguiente paso es utilizar un nombre de la OldDbConnection le gusta ('MyLongF ~ 1' en lugar de 'MyLongFilename'), lo que lleva a esto:

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

esto tiene un retorno satisfactorio un OleDbConnection. Ahora para obtener la tabla de esquema que intento el siguiente:

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

Esto devuelve una DataTable con ninguna fila. Si cambio el nombre del nombre de archivo a 8 caracteres o menos, este código funciona y obtengo una fila para cada campo en la base de datos.

Con el nombre de archivo largo, sé que la conexión devuelto es válida porque puedo utilizar para llenar un conjunto de datos de este 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); 

Esto me devuelve un conjunto de datos que contiene un DataTable con todos los datos de el archivo dbf.

Entonces la pregunta es ¿cómo puedo obtener solo la tabla de esquema para el largo archivo dbf llamado? Por supuesto que puedo solucionar el problema cambiando el nombre/copiando el archivo, pero ese es un truco que no quiero tener que hacer. Tampoco quiero llenar el DataSet con el registro superior 1 y deducir el esquema de las columnas.

Respuesta

1

Bueno, creo que la conexión debe ser

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

y el otro es, tal vez debería probar con otro proveedor, que impulsó mucho a lo largo de atrás cuando utilicé la siguiente manera:

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

Pero usted debe tener instalado VFP 7

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 contiene la versión corta del nombre de archivo? Además, MyLongF ~ 1 tiene 9 caracteres, no 8.

2

Según MSDN, la carpeta representa la base de datos y los archivos representan las tablas. Debería utilizar la ruta del directorio que no incluye el nombre del archivo en la cadena de conexión, y el nombre de la tabla como parte de las restricciones de GetOleDbSchemaTable.

+0

Esto parece ser un problema, pero no explica todos los problemas. –

0

Si tiene un archivo dbf único (y posiblemente pequeño), puede resolver el problema copiando el archivo dbf en otro lugar y abrir la copia en lugar del archivo original.

0

Creo que el DataSource debe representar el directorio que contiene los archivos .DBF. Cada unoEl archivo DBF corresponde a una tabla en ese directorio.

Mi conjetura es c: \ MyLongF ~ 1 es un nombre corto para un directorio que contiene un nombre de archivo correspondiente a MyLongF ~ 1 # DBF

¿Se puede verificar si es o no es el caso?

Cuestiones relacionadas