none
Guardar estructura de base de datos en xml RRS feed

  • Pregunta

  • Buenas, tengo una duda de como puedo guardar la estructura de una base de datos en formato XML.

    Por ejemplo:

    Tengo una base de datos llamada Centro.bd (por ejemplo) y esta base de datos, tiene tablas, como "Alumnos" y "Profesores" y "Asignaturas".
    Estas tablas tienen sus "columnas" por ejemplo en Alumnos: Id, Nombre, Apellidos, Edad, Curso
    En Profesores: Id, Nombre, Apellidos, Edad, Salario
    En Asignaturas: Id, Nombre

    Y el archivo xml debería mostrarse así:

    <?xml version="1.0" encoding="utf-8"?>
    <Centro>
         <Table id=”Alumnos”>
              <Fila>Id, Nombre, Apellidos, Edad, Curso</Fila>
         </Table>
         <Table id=”Profesores”>
              <Fila>Id, Nombre, Apellidos, Edad, Salario</Fila>
         </Table>
         <Table id=”Asignaturas”>
              <Fila>Id, Nombre</Fila>
         </Table>
    </Centro>

    Como puedo obtener el nombre de las tablas y sus campos? Estoy usando en mi aplicación SQLite pero no se como hacerlo.
    Como puedo hacer una consulta que me devuelva toda la estructura de la base de datos? Es posible?

    Un saludo y grácias.

    martes, 23 de diciembre de 2014 18:48

Respuestas

  • En SQL Server uno puede usar la información en el esquema sys.

    Por ejemplo, la siguiente consulta lista todas las tablas que no son "de sistema":

    Select
        *
    From
        sys.tables
    Where
        type = N'U'
    ;
    

    Esa consulta devuelve la columna name que es el nombre de la tabla.  Si quiere saber el esquema tiene que agregar SCHEMA_NAME(schema_id) al SELECT.

    Luego la siguiente consulta devuelve la definición de columnas de una tabla particular:

    Select
        *
    From
        sys.columns
    Where
        object_id = Object_ID('dbo.NombreDeTabla')
    ;
    

    Esa consulta devuelve el nombre de la columna, el tamaño máximo, la escala, la precisión, collation, si puede contener nulos, etc.

    También puede hacer consultas que listen índices, foreign keys, check constraints, etc.  Todo puede averiguarse.


    Jose R. MCP
    Code Samples

    • Marcado como respuesta Abeld89 miércoles, 31 de diciembre de 2014 8:14
    sábado, 27 de diciembre de 2014 20:49

Todas las respuestas

  • En SQL Server uno puede usar la información en el esquema sys.

    Por ejemplo, la siguiente consulta lista todas las tablas que no son "de sistema":

    Select
        *
    From
        sys.tables
    Where
        type = N'U'
    ;
    

    Esa consulta devuelve la columna name que es el nombre de la tabla.  Si quiere saber el esquema tiene que agregar SCHEMA_NAME(schema_id) al SELECT.

    Luego la siguiente consulta devuelve la definición de columnas de una tabla particular:

    Select
        *
    From
        sys.columns
    Where
        object_id = Object_ID('dbo.NombreDeTabla')
    ;
    

    Esa consulta devuelve el nombre de la columna, el tamaño máximo, la escala, la precisión, collation, si puede contener nulos, etc.

    También puede hacer consultas que listen índices, foreign keys, check constraints, etc.  Todo puede averiguarse.


    Jose R. MCP
    Code Samples

    • Marcado como respuesta Abeld89 miércoles, 31 de diciembre de 2014 8:14
    sábado, 27 de diciembre de 2014 20:49
  • hola

    podrias consultar la tabla y cargar una clase que serialices a xml

    Cómo deserializar un objeto

    pero me pregunto sabes como usar un reader para cargar la lista de una case que definas

    [WinForms] Edición Empleados

    analiza la capa de datos, veras como cargar una lista que luego serializas a xml

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    domingo, 28 de diciembre de 2014 1:37
  • Hola Leandro, tu tutorial me ha servido para realizar otras tareas de mi aplicación. Lo que realmente necesitaba es lo que me ha proporcionado Jose con su respuesta. Necesitaba saber una forma de obtener el nombre de las tablas.

    Mi programa esta basado en capas "presentación - negocio - datos" y lo que estaba haciendo es, que desde la parte de presentación inicia la copia de seguridad y negocio llama a todas las tablas. Como me indica Jose desde la consulta obtengo todos los nombres de todas las tablas y los guardo en un array de strings. Despúes realizo las llamadas de negocio a datos para que me devuelvan todos los datos de las tablas y los voy serializando, metiendo directamente a un archivo .xml

    Un saludo y grácias por las respuestas :)

    miércoles, 31 de diciembre de 2014 8:19
  • La forma estándar de obtener las tablas y vistas de una base de datos con ADO.NET sea cual sea el sistema de base de datos es usando el método DbConnection.GetSchema

    Lo que propone José sólo vale para SQL Server, no vale para SQLite que es lo que usas tú.



    Jesús López


    EntityLite a lightweight, database first, micro orm

    miércoles, 31 de diciembre de 2014 9:34
  • >>Mi programa esta basado en capas "presentación - negocio - datos" y lo que estaba haciendo es, que desde la parte de presentación inicia la copia de seguridad y negocio llama a todas las tablas. Como me indica Jose desde la consulta obtengo todos los nombres de todas las tablas y los guardo en un array de strings. Despúes realizo las llamadas de negocio a datos para que me devuelvan todos los datos de las tablas y los voy serializando, metiendo directamente a un archivo .xml

    pero de esta forma no se realiza una copia de seguridad

    la copia se realiza mediante un dump de la db pero con algun comand, ademas sqlite es basicamente un archivo, con realizar un File.Copy() podrias implementar el backup

    recuperar el schema de las tablas desde la presentacion no es correcto y menos enviar nombre de tablas a la capa de negocio, de ultima la capa de negocio deberia realizar todo el proceso de descubrimiento de las tablas y volcado

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 31 de diciembre de 2014 12:23
  • Otra cuestión es la de las copias de seguridad. En SQLite hay dos formas "estándar" de hacer las copias de seguidad. Una es con el propio API de SQLite, System.Data.SQLite tiene un api específico para hacer copias de seguridad. Las otra forma es la forma "Windows", usando el servicio de Shadow Copy, puedes hacer una shadow copy del volumen donde está la base de datos y luego copiar el archivo de la base de datos de SQLite y del journal file


    Jesús López


    EntityLite a lightweight, database first, micro orm

    miércoles, 31 de diciembre de 2014 14:31