none
Copiar la estructura de las tablas de una base de datos a otra vacía. RRS feed

  • Pregunta

  • Buenas tardes.

    Lo que pretendo es copiar la estructura de todas las tablas, menos de una que copiaría la estructura  y los datos, de una base de datos a otra vacía.

    Y como segundo paso copiar desde otra base de datos los datos de las tablas a la misma base, de principio tienen las mismas tablas lo que no estoy seguro es de si tienen la misma estructura.

    Del primer paso no sé si se pueden copiar directamente o a través de un ComboList que buscando es lo que he encontrado, código del maestro Enrique que me he permitido copiarlo.

    El problema es que no se me llenan los combolist.

    Paso el código para ver si está bien puesto.

    Imports System.Data.OleDb Public Class FCopiartablas Public cna As New OleDbConnection Public cnn As New OleDbConnection Public cng As New OleDbConnection Private Sub FCopiartablas_Load(sender As Object, e As EventArgs) Handles MyBase.Load ' Instalamos los controladores para los eventos ' SelectionChangeCommitted de los dos controles ' ComboBox. ' AddHandler ComboBox1.SelectionChangeCommitted, AddressOf ComboBoxOnSelectionChangeCommitted AddHandler ComboBox2.SelectionChangeCommitted, AddressOf ComboBoxOnSelectionChangeCommitted End Sub Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Try ' Tablas que comienzan por la letra C ComboBox1.DataSource = ObtenerTablas("C*") ' Tablas que comienzan por la letra T ComboBox2.DataSource = ObtenerTablas("T*") Catch ex As Exception ' Se ha producido un error MessageBox.Show(ex.Message) End Try End Sub Private Sub ComboBoxOnSelectionChangeCommitted(sender As Object, e As EventArgs) ' Referenciamos el control ComboBox que ha desencadenado el evento. ' Dim cb As ComboBox = TryCast(sender, ComboBox) If (cb Is Nothing) Then Return ' Nombre de la tabla actualmente seleccionada. Dim nombreTablaOrigen = cb.SelectedValue.ToString() ' Nombre de la tabla que se desea buscar. Dim nombreTablaDestino = String.Empty If (cb.Name = "ComboBox1") Then nombreTablaDestino = "T" & nombreTablaOrigen.Substring(1) ComboBox2.DataSource = ObtenerTablas(nombreTablaDestino) ElseIf (cb.Name = "ComboBox2") Then nombreTablaDestino = "C" & nombreTablaOrigen.Substring(1) ComboBox1.DataSource = ObtenerTablas(nombreTablaDestino) End If End Sub ''' <summary> ''' Devuelve una matriz con el nombre de las tablas que ''' empienzan por un determinado carácter. ''' </summary> ''' <param name="nombreInicio">Nombre de inicio de la tablas.</param> ''' <author>Enrique Martínez Montejo - 2014</author> ''' <returns></returns> ''' <remarks></remarks> Friend Function ObtenerTablas(nombreInicio As String) As String() Dim dtn As DataTable = Nothing Dim cadenaConexion As String cadenaConexion = strcon & rutan Using cnn As New OleDbConnection(cadenaConexion) MsgBox(cadenaConexion) cnn.Open() dtn = cnn.GetSchema("TABLES") End Using ' Para SQL Server el valor de TABLE_TYPE es BASE TABLE. ' Return (From row As DataRow In dtn.Rows.Cast(Of DataRow)() Where CStr(row("TABLE_TYPE")) = "TABLE" AndAlso CStr(row("TABLE_NAME")) Like nombreInicio Order By row("TABLE_NAME") Select CStr(row("TABLE_NAME"))).ToArray() End Function Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click Me.Close() End Sub End Class

    Las BD son de access.

    Gracias y saludos.


    lunes, 22 de febrero de 2016 18:10

Respuestas

  • "Ángelroso" escribió:

    > Lo que pretendo es copiar la estructura de todas las tablas,...
    >
    > Del primer paso no sé si se pueden copiar directamente o a través de un ComboList ...
    >
    > El problema es que no se me llenan los combolist.

    Para copiar la estructura de una tabla (se pueda hacer o no), no sé para qué necesitas el procedimiento ObtenerTablas ni llenar un "combolist", que me imagino habrás querido decir un control ComboBox.

    >    ''' <summary>
    >    ''' Devuelve una matriz con el nombre de las tablas que
    >    ''' empienzan por un determinado carácter.
    >    ''' </summary>
    >    ''' <param name="nombreInicio">Nombre de inicio de la tablas.</param>
    >    ''' <author>Enrique Martínez Montejo - 2014</author>
    >    ''' <returns></returns>
    >    ''' <remarks></remarks>
    >    Friend Function ObtenerTablas(nombreInicio As String) As String()
    >
    >        Dim dtn As DataTable = Nothing
    >        Dim cadenaConexion As String
    >        cadenaConexion = strcon & rutan
    >
    >    End Function

    ¿Lo que aparece remarcado en negrita figuraba en la función original? Te lo pregunto porque me extraña bastante que yo haya escrito algo así. No obstante, dejo la función como yo entiendo que debería estar codificada:

        ''' <summary>
        ''' Devuelve una matriz con el nombre de las tablas que
        ''' empienzan por un determinado carácter.
        ''' </summary>
        ''' <param name="nombreInicio">Nombre de inicio de la tablas.</param>
        ''' <param name="cadenaConexion">Cadena de conexión con un origen de datos OleDb.</param>
        ''' <author>Enrique Martínez Montejo - 2014</author>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Friend Shared Function ObtenerTablas(nombreInicio As String, cadenaConexion As String) As String()
    
            Dim dt As DataTable = Nothing
            Using cnn As New OleDbConnection(cadenaConexion)
                cnn.Open()
                dt = cnn.GetSchema("TABLES")
            End Using
    
            ' Para SQL Server el valor de TABLE_TYPE es BASE TABLE.
            '
            Return (From row As DataRow In dt.Rows.Cast(Of DataRow)()
                    Where CStr(row("TABLE_TYPE")) = "TABLE" AndAlso CStr(row("TABLE_NAME")) Like nombreInicio
                    Order By row("TABLE_NAME")
                    Select CStr(row("TABLE_NAME"))).ToArray()
    
        End Function

    Es decir, a la función le tienes que pasar el nombre de inicio de las tablas, como por ejemplo, "C*", "Cl*", "T*", y como segundo parámetro, la cadena de conexión completa con un origen de datos OleDb, como bien puede ser una base de datos de Access.

    Suponiendo que tu intención sea rellenar dos controles ComboBox, uno con las tablas que comienzan por la letra "C" y otro con las que comienzan por la letra "T", tan solo llamarías a la función ejecutando el siguiente código:

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            ' Declaramos la cadena de conexión con una base de datos de Access.
            Dim cadenaConexion As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Mis documentos\Database1.accdb"
    
            Try
                ' Tablas que comienzan por la letra C
                Dim tablas As String() = ObtenerTablas("C*", cadenaConexion)
                ComboBox1.DataSource = tablas
                If (tablas.Length = 0) Then
                    MessageBox.Show("No existen tablas cuyo nombre comience por la letra C.")
                End If
    
                ' Tablas que comienzan por la letra T
                tablas = ObtenerTablas("T*", cadenaConexion)
                ComboBox2.DataSource = tablas
                If (tablas.Length = 0) Then
                    MessageBox.Show("No existen tablas cuyo nombre comience por la letra T.")
                End If
    
            Catch ex As Exception
                ' Se ha producido un error
                MessageBox.Show(ex.Message)
    
            End Try
    
        End Sub

    Si no se rellena alguno de los dos controles ComboBox, entiendo que será porque no existen tablas cuyo nombre comienza por la letra C o por la letra T.

    En principio ese el código fuente necesario para rellenar un control ComboBox con el resultado devuelto por la función ObtenerTablas.

    ¿Que deseas conocer también qué elemento se ha seleccionado en un control ComboBox? Entonces sí puedo entender que implementes el evento ComboBoxOnSelectionChangeCommitted del control ComboBox, en el cual conocerías el nombre de la tabla seleccionada ejecutando:

        Private Sub ComboBoxOnSelectionChangeCommitted(sender As Object, e As EventArgs)
    
            ' Referenciamos el control ComboBox que ha desencadenado el evento.
            '
            Dim cb As ComboBox = TryCast(sender, ComboBox)
            If (cb Is Nothing) Then Return
    
            ' Nombre de la tabla actualmente seleccionada en el control
            ' que ha desencadenado el evento.
            '
            Dim nombreTablaSeleccionada As String = cb.SelectedValue.ToString()
            MessageBox.Show(nombreTablaSeleccionada)
    
        End Sub

    Pero desde este procedimiento NO VOLVERÍAS a llamar a la función ObtenerTablas, porque para eso la has llamado ya desde el evento Button1.Click.

    Por cierto, si los controles ComboBox los vas a rellenar con el resultado devuelto por la función ObtenerTablas, mejor será que impidas que el usuario pueda escribir algún nombre en dichos controles:

        Private Sub FCopiartablas_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
            ' Para impedir que el usuario pueda escribir directamente
            ' en los controles ComboBox.
            '
            ComboBox1.DropDownStyle = ComboBoxStyle.DropDownList
            ComboBox2.DropDownStyle = ComboBoxStyle.DropDownList
    
            AddHandler ComboBox1.SelectionChangeCommitted, AddressOf ComboBoxOnSelectionChangeCommitted
            AddHandler ComboBox2.SelectionChangeCommitted, AddressOf ComboBoxOnSelectionChangeCommitted
    
        End Sub

    Por último, te comento que con todo este código lo único que conseguirás es rellenar los controles ComboBox con los nombres de las tablas que deseas, pero desde luego, no esperes que con ello se copien las estructuras de las tablas a otra base de datos, que es lo que indicas en el Asunto de tu mensaje y creo que no se corresponde con el Cuerpo del mismo. ;-)


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.


    martes, 23 de febrero de 2016 16:24
    Moderador
  • "Ángelroso" escribió:

    > No obstante se me ocurre que la función obtener tablas puede que sirva,
    > cada vez que se obtiene una tabla usar el "Clone".

    No sé a qué método Clone te refieres, pero para copiar tablas de una base de datos a otra sin utilizar los objetos propios de la biblioteca de Microsoft Access, tienes que ejecutar una consulta SELECT * INTO (copia la estructura de la tabla y opcionalmente los datos), o INSERT INTO (copia solamente los datos a una tabla ya existente).

    La función ObtenerTablas te puede ser útil para obtener una matriz con los nombres de todas las tablas que existen en la base de datos de Access que has especificado en el parámetro Data Source de la cadena de conexión pasada al procedimiento:

        ''' <summary>
        ''' Devuelve una matriz con el nombre de las tablas existentes en la base de datos especificada.
        ''' </summary>
        ''' <param name="cadenaConexion">Cadena de conexión con un origen de datos OleDb.</param>
        ''' <author>Enrique Martínez Montejo - 2014</author>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Friend Shared Function ObtenerTablas(cadenaConexion As String) As String()
    
            Dim dt As DataTable = Nothing
            Using cnn As New OleDbConnection(cadenaConexion)
                cnn.Open()
                dt = cnn.GetSchema("TABLES")
            End Using
    
            ' Para SQL Server el valor de TABLE_TYPE es BASE TABLE.
            '
            Return (From row As DataRow In dt.Rows.Cast(Of DataRow)()
                    Where CStr(row("TABLE_TYPE")) = "TABLE"
                    Select CStr(row("TABLE_NAME"))).ToArray()
    
        End Function

    Y obtendrías la matriz con los nombres ejecutando:

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            ' Declaramos la cadena de conexión con una base de datos de Access.
            Dim cadenaConexion As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Mis documentos\Database1.accdb"
    
            Try
                Dim tablas As String() = ObtenerTablas(cadenaConexion)
                ComboBox1.DataSource = tablas
    
            Catch ex As Exception
                ' Se ha producido un error
                MessageBox.Show(ex.Message)
    
            End Try
    
        End Sub

    Ahora puedes recorrer la matriz para exportar/importar la tabla a la base de datos de destino con el nombre del elemento actual de la matriz.

    Si deseas conocer cómo se importa una tabla de Access desde la base de datos de destino, consulta mis respuestas que aparecen al final de la siguiente conversación:

    Select into

    Y habrá muchos más mensajes relacionados con exportar/importar datos de Access a otra base de datos de Access en este mismo foro, porque bastantes veces he respondido a este tipo de preguntas. ;-)

    Por cierto, se me olvidaba comentarte que con la consulta SELECT * INTO puedes copiar la estructura de la tabla, pero NO los índices que ésta pudiera tener, incluido aquel que actúe de clave principal de la tabla.


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.






    jueves, 25 de febrero de 2016 11:06
    Moderador

Todas las respuestas

  • "Ángelroso" escribió:

    > Lo que pretendo es copiar la estructura de todas las tablas,...
    >
    > Del primer paso no sé si se pueden copiar directamente o a través de un ComboList ...
    >
    > El problema es que no se me llenan los combolist.

    Para copiar la estructura de una tabla (se pueda hacer o no), no sé para qué necesitas el procedimiento ObtenerTablas ni llenar un "combolist", que me imagino habrás querido decir un control ComboBox.

    >    ''' <summary>
    >    ''' Devuelve una matriz con el nombre de las tablas que
    >    ''' empienzan por un determinado carácter.
    >    ''' </summary>
    >    ''' <param name="nombreInicio">Nombre de inicio de la tablas.</param>
    >    ''' <author>Enrique Martínez Montejo - 2014</author>
    >    ''' <returns></returns>
    >    ''' <remarks></remarks>
    >    Friend Function ObtenerTablas(nombreInicio As String) As String()
    >
    >        Dim dtn As DataTable = Nothing
    >        Dim cadenaConexion As String
    >        cadenaConexion = strcon & rutan
    >
    >    End Function

    ¿Lo que aparece remarcado en negrita figuraba en la función original? Te lo pregunto porque me extraña bastante que yo haya escrito algo así. No obstante, dejo la función como yo entiendo que debería estar codificada:

        ''' <summary>
        ''' Devuelve una matriz con el nombre de las tablas que
        ''' empienzan por un determinado carácter.
        ''' </summary>
        ''' <param name="nombreInicio">Nombre de inicio de la tablas.</param>
        ''' <param name="cadenaConexion">Cadena de conexión con un origen de datos OleDb.</param>
        ''' <author>Enrique Martínez Montejo - 2014</author>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Friend Shared Function ObtenerTablas(nombreInicio As String, cadenaConexion As String) As String()
    
            Dim dt As DataTable = Nothing
            Using cnn As New OleDbConnection(cadenaConexion)
                cnn.Open()
                dt = cnn.GetSchema("TABLES")
            End Using
    
            ' Para SQL Server el valor de TABLE_TYPE es BASE TABLE.
            '
            Return (From row As DataRow In dt.Rows.Cast(Of DataRow)()
                    Where CStr(row("TABLE_TYPE")) = "TABLE" AndAlso CStr(row("TABLE_NAME")) Like nombreInicio
                    Order By row("TABLE_NAME")
                    Select CStr(row("TABLE_NAME"))).ToArray()
    
        End Function

    Es decir, a la función le tienes que pasar el nombre de inicio de las tablas, como por ejemplo, "C*", "Cl*", "T*", y como segundo parámetro, la cadena de conexión completa con un origen de datos OleDb, como bien puede ser una base de datos de Access.

    Suponiendo que tu intención sea rellenar dos controles ComboBox, uno con las tablas que comienzan por la letra "C" y otro con las que comienzan por la letra "T", tan solo llamarías a la función ejecutando el siguiente código:

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            ' Declaramos la cadena de conexión con una base de datos de Access.
            Dim cadenaConexion As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Mis documentos\Database1.accdb"
    
            Try
                ' Tablas que comienzan por la letra C
                Dim tablas As String() = ObtenerTablas("C*", cadenaConexion)
                ComboBox1.DataSource = tablas
                If (tablas.Length = 0) Then
                    MessageBox.Show("No existen tablas cuyo nombre comience por la letra C.")
                End If
    
                ' Tablas que comienzan por la letra T
                tablas = ObtenerTablas("T*", cadenaConexion)
                ComboBox2.DataSource = tablas
                If (tablas.Length = 0) Then
                    MessageBox.Show("No existen tablas cuyo nombre comience por la letra T.")
                End If
    
            Catch ex As Exception
                ' Se ha producido un error
                MessageBox.Show(ex.Message)
    
            End Try
    
        End Sub

    Si no se rellena alguno de los dos controles ComboBox, entiendo que será porque no existen tablas cuyo nombre comienza por la letra C o por la letra T.

    En principio ese el código fuente necesario para rellenar un control ComboBox con el resultado devuelto por la función ObtenerTablas.

    ¿Que deseas conocer también qué elemento se ha seleccionado en un control ComboBox? Entonces sí puedo entender que implementes el evento ComboBoxOnSelectionChangeCommitted del control ComboBox, en el cual conocerías el nombre de la tabla seleccionada ejecutando:

        Private Sub ComboBoxOnSelectionChangeCommitted(sender As Object, e As EventArgs)
    
            ' Referenciamos el control ComboBox que ha desencadenado el evento.
            '
            Dim cb As ComboBox = TryCast(sender, ComboBox)
            If (cb Is Nothing) Then Return
    
            ' Nombre de la tabla actualmente seleccionada en el control
            ' que ha desencadenado el evento.
            '
            Dim nombreTablaSeleccionada As String = cb.SelectedValue.ToString()
            MessageBox.Show(nombreTablaSeleccionada)
    
        End Sub

    Pero desde este procedimiento NO VOLVERÍAS a llamar a la función ObtenerTablas, porque para eso la has llamado ya desde el evento Button1.Click.

    Por cierto, si los controles ComboBox los vas a rellenar con el resultado devuelto por la función ObtenerTablas, mejor será que impidas que el usuario pueda escribir algún nombre en dichos controles:

        Private Sub FCopiartablas_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
            ' Para impedir que el usuario pueda escribir directamente
            ' en los controles ComboBox.
            '
            ComboBox1.DropDownStyle = ComboBoxStyle.DropDownList
            ComboBox2.DropDownStyle = ComboBoxStyle.DropDownList
    
            AddHandler ComboBox1.SelectionChangeCommitted, AddressOf ComboBoxOnSelectionChangeCommitted
            AddHandler ComboBox2.SelectionChangeCommitted, AddressOf ComboBoxOnSelectionChangeCommitted
    
        End Sub

    Por último, te comento que con todo este código lo único que conseguirás es rellenar los controles ComboBox con los nombres de las tablas que deseas, pero desde luego, no esperes que con ello se copien las estructuras de las tablas a otra base de datos, que es lo que indicas en el Asunto de tu mensaje y creo que no se corresponde con el Cuerpo del mismo. ;-)


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.


    martes, 23 de febrero de 2016 16:24
    Moderador
  • Hola, Enrique. Buenos días.

    Gracias por tu contestación.

    Yo pensaba que una vez añadidos al Combobox, desde ahí se podrían copiar las tablas. Como no es así, seguiré buscando otras opciones. He visto la forma de hacer con una tabla, pero no con todas de una base de datos

    No obstante se me ocurre que la función obtener tablas puede que sirva, cada vez que se obtiene una tabla usar el "Clone".

    Voy a intentarlos a ver.

    Gracias y saludos.

    jueves, 25 de febrero de 2016 10:49
  • "Ángelroso" escribió:

    > No obstante se me ocurre que la función obtener tablas puede que sirva,
    > cada vez que se obtiene una tabla usar el "Clone".

    No sé a qué método Clone te refieres, pero para copiar tablas de una base de datos a otra sin utilizar los objetos propios de la biblioteca de Microsoft Access, tienes que ejecutar una consulta SELECT * INTO (copia la estructura de la tabla y opcionalmente los datos), o INSERT INTO (copia solamente los datos a una tabla ya existente).

    La función ObtenerTablas te puede ser útil para obtener una matriz con los nombres de todas las tablas que existen en la base de datos de Access que has especificado en el parámetro Data Source de la cadena de conexión pasada al procedimiento:

        ''' <summary>
        ''' Devuelve una matriz con el nombre de las tablas existentes en la base de datos especificada.
        ''' </summary>
        ''' <param name="cadenaConexion">Cadena de conexión con un origen de datos OleDb.</param>
        ''' <author>Enrique Martínez Montejo - 2014</author>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Friend Shared Function ObtenerTablas(cadenaConexion As String) As String()
    
            Dim dt As DataTable = Nothing
            Using cnn As New OleDbConnection(cadenaConexion)
                cnn.Open()
                dt = cnn.GetSchema("TABLES")
            End Using
    
            ' Para SQL Server el valor de TABLE_TYPE es BASE TABLE.
            '
            Return (From row As DataRow In dt.Rows.Cast(Of DataRow)()
                    Where CStr(row("TABLE_TYPE")) = "TABLE"
                    Select CStr(row("TABLE_NAME"))).ToArray()
    
        End Function

    Y obtendrías la matriz con los nombres ejecutando:

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            ' Declaramos la cadena de conexión con una base de datos de Access.
            Dim cadenaConexion As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Mis documentos\Database1.accdb"
    
            Try
                Dim tablas As String() = ObtenerTablas(cadenaConexion)
                ComboBox1.DataSource = tablas
    
            Catch ex As Exception
                ' Se ha producido un error
                MessageBox.Show(ex.Message)
    
            End Try
    
        End Sub

    Ahora puedes recorrer la matriz para exportar/importar la tabla a la base de datos de destino con el nombre del elemento actual de la matriz.

    Si deseas conocer cómo se importa una tabla de Access desde la base de datos de destino, consulta mis respuestas que aparecen al final de la siguiente conversación:

    Select into

    Y habrá muchos más mensajes relacionados con exportar/importar datos de Access a otra base de datos de Access en este mismo foro, porque bastantes veces he respondido a este tipo de preguntas. ;-)

    Por cierto, se me olvidaba comentarte que con la consulta SELECT * INTO puedes copiar la estructura de la tabla, pero NO los índices que ésta pudiera tener, incluido aquel que actúe de clave principal de la tabla.


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.






    jueves, 25 de febrero de 2016 11:06
    Moderador