entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

Copiar datos de oracle a sql server (VB.Net)

Buenos días

Estoy intentando copiar los datos de una base de datos de Oracle a otra de igual estructura en Sql Server sin necesidad de tener que recorrer campo por campo para guardarlos, es decir, intento hacer in insert de los datos de oracle a la base de datos de SQL Server; he preguntado en el Foro de MSDN cómo hacerlo con LINQ to SQL, pero no he obtenido respuesta, así es que lo he intentado de otra forma, importando las filas del DataTable de oracle al Datatable de SQL Server.

He creado un formulario con un DataGridView enlazado a un BindingSource (BS_SQL) para ver si se muestran los datos importados al DataTable de SQL Server y hasta ahí todo funciona perfectamente, el problema es que no llega a guardar los datos en la base de datos de SQL Server.

De antemano, gracias por la ayuda que me puedan brindar.

Para mejor ilustración copio el programa:

    Try
        'Conexión Oracle

        strSQL = "SELECT * FROM CURSOS ORDER BY ID_CURSO"
        strCnOra = "Data Source=(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = server.es)(PORT = 1531)))(CONNECT_DATA = (SID = PRO01)));" _
       + "User Id=USER;Password=PASS;"

        daOra = New OracleDataAdapter(strSQL, strCnOra)

        cnOra = New OracleConnection(strCnOra)
        cnOra.Open()

        daOra.Fill(ds, "CURSOS_ORA")

        'Conexión SQL
        Me.Text = "CURSOS SQL"
        Me.dgv_Tabla.DataSource = BS_SQL

        strSQL = "SELECT * FROM CURSOS ORDER BY ID_CURSO"
        strCnSQL = "Data Source=SERVERSQL;Initial Catalog=BD;Persist Security Info=True;User ID=sa;Password=PASS"

        cnSQL = New SqlConnection(strCnSQL)
        cnSQL.Open()

        daSQL = New SqlDataAdapter(strSQL, strCnSQL)

        cbSQL = New SqlCommandBuilder(daSQL)
        cbSQL.QuotePrefix = "["
        cbSQL.QuoteSuffix = "]"

        daSQL.InsertCommand = cbSQL.GetInsertCommand()
        daSQL.UpdateCommand = cbSQL.GetUpdateCommand()
        daSQL.DeleteCommand = cbSQL.GetDeleteCommand()

        daSQL.Fill(ds, "CURSOS_SQL")

        With ds.Tables("CURSOS_SQL")
            .AcceptChanges()
            .BeginInit()
        End With

        BS_SQL.DataSource = ds
        BS_SQL.DataMember = "CURSOS_SQL"

        For Each drOra As DataRow In ds.Tables("CURSOS_ORA").Rows
            ds.Tables("CURSOS_SQL").NewRow()
            ds.Tables("CURSOS_SQL").ImportRow(drOra)
        Next

        BS_SQL.EndEdit()
        daSQL.Update(ds, "CURSOS_SQL")**
    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try

1voto

carlossevi comentado

Si lo que quieres es hacer un copiado masivo, no te recomiendo cargar los datos en un DataGridView a no ser que quieras darle al usuario una previsualización. Para copiado masivo de datos con buen rendimiento te recomiendo que le eches un vistazo a SqlBulkCopy.

1voto

FedericoLuna comentado

Muchas gracias Carlos.

Lo intentaré mañana.

Lo del DataGridView no es realmente parte del programa, es sólo para comprobar que los datos del DataTable de oracle se pasaban correctamente al DataTable de SQl Server.

Entonces utilizando SQLBulkCopy y los mismos datos del programa sería algo así:

Dim bulkCopy As SqlBulkCopy = new SqlBulkCopy(strCnSQL)

bulkCopy.DestinationTableName = "dbo.CURSOS"

Try
    bulkCopy.WriteToServer(ds.Tables("CURSOS_SQL"))

Catch ex As Exception
    Console.WriteLine(ex.Message)

Finally
    'Cierro conecciones
    cnORA.Close()
    cnSQL.Close()
End Try

1 Respuesta

0voto

FedericoLuna Puntos330

Muchas gracias por el soplo Carlos.

Funcionó correctamente con SqlBulkCopy.

El código quedó así:

            strSQL = "SELECT * FROM CURSOS ORDER BY ID_CURSO"
            strCnOra = "Data Source=(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = server.es)(PORT = 1531)))(CONNECT_DATA = (SID = PRO01)));" _
           + "User Id=USER;Password=PASS;"

            daOra = New OracleDataAdapter(strSQL, strCnOra)

            cnOra = New OracleConnection(strCnOra)
            cnOra.Open()

            daOra.Fill(ds, "CURSOS_ORA")

            strCnSQL = "Data Source=SERVERSQL;Initial Catalog=SGC;Persist Security Info=True;User ID=sa;Password=PASS"

            Dim SqlBk As New SqlBulkCopy(strCnSQL)

            With SqlBk
                .DestinationTableName = "dbo.CURSOS"
                .WriteToServer(ds.Tables("CURSOS_ORA"))
            End With

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta