none
Listar .DBF's que están dentro de un .DBC en gridview RRS feed

  • Pregunta

  • Hola, les escribo ya que necesito su ayuda...
    Tengo lo siguiente... una carpeta la cual contiene un archivo .DBC (contenedor de bases de datos de visual foxpro) el cual contiene "links" por así decirlo a muchas bases de datos .DBF's las cuales están en la misma carpeta. El problema es que al borrar uno de estos .DBF's, entonces en el DBC quedará el puntero apuntando a una base de datos que no está.. por lo que necesito eliminar ese puntero. Y lo que me decidí a hacer es una aplicación pequeña en C# .NET la cual me liste todas las bases de datos (punteros) que contiene éste .DBC y eliminar las que no existan en la carpeta (las .DBF's que fueron eliminadas). Pero he aquí que no se como efectuar consultas contra el contenedor de bases de datos para que me muestre en un gridview todos los punteros que éste tiene. Uds me podrían ayudar? Ya que estoy bastante perdido en todo esto.
    Les agradezco de antemano, muchas gracias!!!
    domingo, 25 de enero de 2009 22:34

Respuestas

  • Hola Phoenix_uy. Lamentablemente utilizando OLE DB no será posible manipular el archivo .dbc. Estuve viendo y Visual FoxPro tiene un comando llamado "VALIDATE DATABASE" que como dice la documentación, asegura que las ubicaciones de las tablas e índices sean correctas. El comando no es soportado en OLE DB: http://msdn.microsoft.com/en-us/library/bt5d78fx(VS.80).aspx

     

    Quizá puedas hacer una aplicación en FoxPro que utilizando este comando elimine los objetos inválidos.

     

    Saludos,
    Nicolás.

    lunes, 26 de enero de 2009 20:48

Todas las respuestas

  • Hola. Espero que el siguiente código te sirva.

    Code Snippet

    using System.Data.OleDb;
    using System.Data;

     

     

    Code Snippet

                OleDbConnectionStringBuilder connectionString = new OleDbConnectionStringBuilder();
                connectionString.DataSource =
    @"D:\Microsoft Visual FoxPro 9 Professional\Samples\Northwind\northwind.dbc";
                connectionString.Provider = "vfpoledb";
                connectionString.Add("Collating Sequence", "MACHINE");
                using (OleDbConnection connection = new OleDbConnection(connectionString.ToString()))
                {
                    connection.Open();
                    DataTable tablesViews = connection.GetSchema("Tables");
                    connection.Close();
                }

     

     


    connection.GetSchema(); -> Devuelve un DataTable llamado "{MetaDataCollections}" con:
    - DataSourceInformation
    - DataTypes
    - Restrictions
    - ReservedWords
    - Columns
    - Indexes
    - Procedures
    - Tables
    - Views

    Si quiero saber las tablas que hay, llamo al siguiente método:

    Code Snippet

    connection.GetSchema("Tables");

     

     

    que además de las tablas también devolverá las vistas. Esto lo sabemos porque connection.GetSchema("Tables") devuelve un DataTable con una columna llamada "TABLE_TYPE" (que está en cuarto lugar). Para devolver sólo las tablas y no las tablas y las vistas, filtramos así:

     

    Code Snippet

    connection.GetSchema("Tables", new string[] { null, null, null, "TABLE" });

     

     

     

    Saludos,
    Nicolás.

    lunes, 26 de enero de 2009 0:14
  • Gracias martín por responder!!!
    Espero no estar pidiendo mucho, pero serías tan amable de decirme que hace cada línea d código? Espero no sea mucha molestia, muchas gracias!!!
    lunes, 26 de enero de 2009 0:19
  • Con OleDbConnectionStringBuilder armo la cadena de conexión. La propiedad DataSource tiene que apuntar al archivo .dbc. Yo utilice northwind.dbc que es uno que viene en Samples. La propiedad Provider tiene que ser vfpoledb porque vamos a utilizar el proveedor OLE DB de Visual FoxPro (VfpOleDB.dll). Como OleDbConnectionStringBuilder no expone una propiedad que nos deje establecer el Collating Sequence, utilizo el método Add para agregarlo a la colección de parámetros de la cadena de conexión. Collating Sequence tiene que ser MACHINE cuando trabajamos con .dbc.

     

    Con OleDbConnection establezco la conexión a la base de datos. Lo encierro dentro de un using porque OleDbConnection implementa la interfaz IDisposable. Al constructor le paso connectionString.ToString(). connectionString.ToString() devolverá la cadena de conexión que armé con OleDbConnectionStringBuilder.

     

    connection.Open(); -> abro la conexión.

     

    El método GetSchema de OleDbConnection nos devuelve la información de esquema. Aquí puedo saber qué es lo que hay dentro del contenedor de base de datos. Cuáles son las tablas, las vistas, etc.

     

    connection.Close(); -> cierro la conexión.

     

    Espero haberte aclarado el código.

     

    Saludos,
    Nicolás.

    lunes, 26 de enero de 2009 0:46
  •  Nicolás.Ferreira Escribió:

    Con OleDbConnectionStringBuilder armo la cadena de conexión. La propiedad DataSource tiene que apuntar al archivo .dbc. Yo utilice northwind.dbc que es uno que viene en Samples. La propiedad Provider tiene que ser vfpoledb porque vamos a utilizar el proveedor OLE DB de Visual FoxPro (VfpOleDB.dll). Como OleDbConnectionStringBuilder no expone una propiedad que nos deje establecer el Collating Sequence, utilizo el método Add para agregarlo a la colección de parámetros de la cadena de conexión. Collating Sequence tiene que ser MACHINE cuando trabajamos con .dbc.

     

    Con OleDbConnection establezco la conexión a la base de datos. Lo encierro dentro de un using porque OleDbConnection implementa la interfaz IDisposable. Al constructor le paso connectionString.ToString(). connectionString.ToString() devolverá la cadena de conexión que armé con OleDbConnectionStringBuilder.

     

    connection.Open(); -> abro la conexión.

     

    El método GetSchema de OleDbConnection nos devuelve la información de esquema. Aquí puedo saber qué es lo que hay dentro del contenedor de base de datos. Cuáles son las tablas, las vistas, etc.

     

    connection.Close(); -> cierro la conexión.

     

    Espero haberte aclarado el código.

     

    Saludos,
    Nicolás.



    Muchísimas gracias, me has aclarado todo perfectamente... en cuanto a la Dll VfpOleDB.dll, que tengo que hacer con ella en cuanto al proyecto en c# .net? La necesito? necesito agregarla como referencia en el proyecto?
    lunes, 26 de enero de 2009 0:53
  • Viene con Microsoft Visual FoxPro. Si en donde vayas a correr la aplicación no tienen Microsoft Visual FoxPro, podés bajar el proveedor de aquí: http://www.microsoft.com/downloads/details.aspx?familyid=E1A87D8F-2D58-491F-A0FA-95A3289C5FD4

    lunes, 26 de enero de 2009 1:02
  •  Nicolás.Ferreira Escribió:

    Viene con Microsoft Visual FoxPro. Si en donde vayas a correr la aplicación no tienen Microsoft Visual FoxPro, podés bajar el proveedor de aquí: http://www.microsoft.com/downloads/details.aspx?familyid=E1A87D8F-2D58-491F-A0FA-95A3289C5FD4



    Gracias!!! Me sirvió!! Sos un genio Wink, aunque quisiera hacerte una última consultita.. como te dije, lo que necesito sería borrar los punteros de las bases de datos (.DBF's) que han sido borrados, como efectúo esa eliminación? y si quiero agregar? Gracias nuevamente!
    lunes, 26 de enero de 2009 11:34
  • Hola Phoenix_uy. Hasta aquí puedo ayudarte. Lo que querés hacer es específico a FoxPro. Podrías preguntar cómo manipular el archivo .dbc en algún foro de FoxPro.

     

    Saludos,
    Nicolás.

    lunes, 26 de enero de 2009 15:28
  • Hola, disculpa que te tenga que preguntar tanto... pero tengo un problema con el método que me diste, y es que si yo borro o cambio el nombre de un dbf que contenga ese dbc, entonces no lo veo en el listado.. y yo necesito verlo. Por lo que veo, está listando los dbf's qué hay en la carpeta, pero yo necesito que liste los links que hay dentro del dbc a todos los dbf's, para poder eliminar de este dbc los que ya no existen. Se entiende?

    lunes, 26 de enero de 2009 18:27
  • Hola Phoenix_uy. Lamentablemente utilizando OLE DB no será posible manipular el archivo .dbc. Estuve viendo y Visual FoxPro tiene un comando llamado "VALIDATE DATABASE" que como dice la documentación, asegura que las ubicaciones de las tablas e índices sean correctas. El comando no es soportado en OLE DB: http://msdn.microsoft.com/en-us/library/bt5d78fx(VS.80).aspx

     

    Quizá puedas hacer una aplicación en FoxPro que utilizando este comando elimine los objetos inválidos.

     

    Saludos,
    Nicolás.

    lunes, 26 de enero de 2009 20:48
  •  Nicolás.Ferreira Escribió:

    Hola Phoenix_uy. Lamentablemente utilizando OLE DB no será posible manipular el archivo .dbc. Estuve viendo y Visual FoxPro tiene un comando llamado "VALIDATE DATABASE" que como dice la documentación, asegura que las ubicaciones de las tablas e índices sean correctas. El comando no es soportado en OLE DB: http://msdn.microsoft.com/en-us/library/bt5d78fx(VS.80).aspx

     

    Quizá puedas hacer una aplicación en FoxPro que utilizando este comando elimine los objetos inválidos.

     

    Saludos,
    Nicolás.



    Muchas gracias por todo lo que has investigado, lo que he conseguido solamente es listar todas las bases de datos que necesito (las que están linkeadas y las que está dañado el link), ahora debería de ver como eliminar... yo he visto el "REMOVE" y es lo que voy a intentar usar.. espero me funcione.

    Gracias nuevamente, me ha servido de mucho tu información.
    lunes, 26 de enero de 2009 21:51