none
Error en nombre de tabla DBF RRS feed

  • Pregunta

  • Hola buenos dias, tengo un problema al momento de abrir una tabla .dbf, el problema es que necesito abrir unos archivos que tienen el nombre largo pero me marca el siguiente error: 

    Excepción no controlada del tipo 'System.Data.OleDb.OleDbException' en System.Data.dll

    Información adicional: El motor de base de datos Microsoft Jet no pudo encontrar el objeto.

    Este es el codigo que tengo y el error me sale en: adapter.Fill(ds);

     DataSet ds = new DataSet();
                string directorio = Path.GetDirectoryName(path);
                string connectionString = @"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + directorio + ";Extended Properties=dBASE III ;User ID=;Password=;";
    
                using (OleDbConnection connection = new OleDbConnection(connectionString))
                {
                    connection.Open();
                    string strQuery = @"SELECT * FROM [" + System.IO.Path.GetFileName(path) + "]";
                    OleDbDataAdapter adapter = new OleDbDataAdapter(@"SELECT * FROM [" + System.IO.Path.GetFileName(path) + "]", connection);
                    adapter.Fill(ds);
                    connection.Close();
                }
                return ds.Tables[0];    


    • Editado NeozDiego martes, 7 de julio de 2015 19:00
    martes, 7 de julio de 2015 19:00

Respuestas

  • Bueno al fin lo he solucionado, el problema es que en la especificación de archivos  DBF solo permite archivos con nombres de maximo 8 caracteres mas la extencion (8.dbf). 

    Les dejo el link donde se explica mejor la solucion: este es el link  

    también les dejo el codigo:

      public string GetShortFileName(string fileDirectory, string fileNameWithExtension)
        {
            StringBuilder temp = new StringBuilder(255);
    
            string path = System.IO.Path.Combine(fileDirectory, fileNameWithExtension);
    
            int n = GetShortPathName(path, temp, 255);
    
            if (n == 0)
                throw new NotImplementedException();
    
            string extension = System.IO.Path.GetExtension(path);
    
            return ((temp.ToString().Split('\\')).Last()).ToLower();//.Replace(extension, string.Empty);
        }
    
        [System.Runtime.InteropServices.DllImport("kernel32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
                public static extern int GetShortPathName(
            [System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPTStr)]    
            string path,
            [System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPTStr)]    
            StringBuilder shortPath,
            int shortPathLength);

    Agregando la funcion con mi codigo quedaria:

     connection.Open();
                    string strQuery = GetShortFileName(System.IO.Path.GetDirectoryName(path), System.IO.Path.GetFileName(path));
                    OleDbDataAdapter adapter = new OleDbDataAdapter(@"SELECT * FROM [" + strQuery + "]", connection);
                    adapter.Fill(ds);
                    connection.Close();


    • Marcado como respuesta NeozDiego miércoles, 8 de julio de 2015 16:45
    • Editado NeozDiego miércoles, 8 de julio de 2015 20:52
    miércoles, 8 de julio de 2015 16:45

Todas las respuestas

  • Hola NeozDiego,

    ¿El nombre de la tabla es igual a una ruta en el disco? 

    martes, 7 de julio de 2015 19:03
  • La tabla esta en un archivo en el disco duro, la variable path contiene la ruta del archivo. 

    Para seleccionar los registros obtengo el nombre del archivo no la ruta.

     string strQuery = @"SELECT * FROM [" + System.IO.Path.GetFileName(path) + "]";

    El problema es cuando el nombre del archivo es mayor a 12 caracteres, incluyendo la extencion del archivo.

    martes, 7 de julio de 2015 19:12
  • Bueno al fin lo he solucionado, el problema es que en la especificación de archivos  DBF solo permite archivos con nombres de maximo 8 caracteres mas la extencion (8.dbf). 

    Les dejo el link donde se explica mejor la solucion: este es el link  

    también les dejo el codigo:

      public string GetShortFileName(string fileDirectory, string fileNameWithExtension)
        {
            StringBuilder temp = new StringBuilder(255);
    
            string path = System.IO.Path.Combine(fileDirectory, fileNameWithExtension);
    
            int n = GetShortPathName(path, temp, 255);
    
            if (n == 0)
                throw new NotImplementedException();
    
            string extension = System.IO.Path.GetExtension(path);
    
            return ((temp.ToString().Split('\\')).Last()).ToLower();//.Replace(extension, string.Empty);
        }
    
        [System.Runtime.InteropServices.DllImport("kernel32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
                public static extern int GetShortPathName(
            [System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPTStr)]    
            string path,
            [System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPTStr)]    
            StringBuilder shortPath,
            int shortPathLength);

    Agregando la funcion con mi codigo quedaria:

     connection.Open();
                    string strQuery = GetShortFileName(System.IO.Path.GetDirectoryName(path), System.IO.Path.GetFileName(path));
                    OleDbDataAdapter adapter = new OleDbDataAdapter(@"SELECT * FROM [" + strQuery + "]", connection);
                    adapter.Fill(ds);
                    connection.Close();


    • Marcado como respuesta NeozDiego miércoles, 8 de julio de 2015 16:45
    • Editado NeozDiego miércoles, 8 de julio de 2015 20:52
    miércoles, 8 de julio de 2015 16:45