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.
Esto parece ser un problema, pero no explica todos los problemas. –