Hola a tod@s!
Es posible trasvasar todos los datos de una tabla de un dataset a una tabla de una base de datos? me refiero a algo tipo "INSERT INTO tabla1 SELECT * FROM tabla2", para no tener que ir insertando fila a fila.
Saludos y gracias.
| |||
Insertar todos los datos de un dataset en una BD Hola a tod@s! Es posible trasvasar todos los datos de una tabla de un dataset a una tabla de una base de datos? me refiero a algo tipo "INSERT INTO tabla1 SELECT * FROM tabla2", para no tener que ir insertando fila a fila. Saludos y gracias. |
| |||
Re: Insertar todos los datos de un dataset en una BD Es más sencillo que eso. ' Defines y asignas la conexión con la base de datos ' Defines el Dataset, en mi caso --> dts conec.Open() adapt.Update(dts, "Nombre_Tabla") --> Nombre_Tabla es la tabla de la BD conec.Close() De esta forma asignas el Dataset entero con una sola línea. Espero que te sirva. Un saludo. |
| |||
![]() Debe ir. Se me olvidó comentar una cosa que es muy importante. La tabla de la base de datos debe tener la misma estructura que la del dataset. Deben ser exactamente iguales en el número de campos, tipos y longitudes. Te puedo poner un ejemplo. No sé con que versión de .NET trabajas ni con que base de datos. Mi ejemplo es para .NET 2003 y base de datos DB2 de AS/400. De todas formas comentarte que funciona exactamente igual con SQL Server 2000. EJEMPLO: Dim MiSQL As String Dim pos As Integer Dim cadena As String Dim linea As String Dim conec400 As OleDb.OleDbConnection conec400 = New OleDb.OleDbConnection("Provider=HiTOLEDB400.1;Pass word=ElQueSea;Persist Security Info=True;User ID=Usuario;Data Source=Servidor;Libraries=Biblioteca;Host Code Page=284 - Spanish;LangID or Table=ESP - Spanish") Dim adapt As OleDb.OleDbDataAdapter Dim AboCommand As OleDbCommandBuilder Dim dtsPAD As New DataSet Dim dtsLEC As New DataSet Dim dts As New DataSet Dim c As Integer Dim dtsLin As DataRow Try txtMensaje.Text = "INICIADO proceso de generación del Archivo ..." Me.Refresh() adapt = New OleDbDataAdapter("SELECT * FROM ARCHIVO", conec400) AboCommand = New OleDbCommandBuilder(adapt) dts = New DataSet 'Carga el ARCHIVO conec400.Open() adapt.Fill(dts, "ARCHIVO") conec400.Close() 'Carga los datos del PADRON MiSQL = "SELECT * FROM PADRON ORDER BY POLIZA ASC" dtsPAD = Conecta(MiSQL) progres.Visible = True progres.Maximum = dtsPAD.Tables(0).Rows.Count totReg.Text = Format((CInt(dtsPAD.Tables(0).Rows.Count)), "#,###,##0") Me.Refresh() 'Recorre el PADRON y va añadiendo los registros al ARCHIVO For c = 0 To dtsPAD.Tables(0).Rows.Count - 1 'Añade un registro nuevo al indato dtsLin = dts.Tables("ARCHIVO").NewRow 'Empieza la asignación de datos dtsLin("POLIZA") = dtsPAD.Tables(0).Rows(c)("POLIZA") 'Apellidos y nombre del abonado dtsLin("APELLIDO1") = dtsPAD.Tables(0).Rows(c)("APE1") dtsLin("APELLIDO2") = dtsPAD.Tables(0).Rows(c)("APE2") dtsLin("NOMBRE") = dtsPAD.Tables(0).Rows(c)("NOMBRE") 'Añade el registro al Dataset destino que se grabará al final del proceso en la base de datos. dts.Tables("ARCHIVO").Rows.Add(dtsLin) ' Suma el registro al contador y a la barra de progreso. numReg.Text = Format((CInt(numReg.Text) + 1), "#,###,##0") totAbo.Text = numReg.Text progres.Value = c + 1 Me.Refresh() Next 'EJECUTA EL COMANDO PARA METER LOS DATOS EN LA BASE DE DATOS txtMensaje.Text = "VOLCANDO Archivo en el AS/400 ..." progres.Visible = False Me.Refresh() conec400.Open() adapt.Update(dts, "ARCHIVO") conec400.Close() txtMensaje.Text = "Proceso terminado. Revise en Archivo del AS/400 ..." Me.Refresh() Catch ex As Exception MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error) Exit Sub End Try End Sub Private Function Conecta(ByVal varSQL As String) As DataSet Dim conectaMDB As OleDb.OleDbConnection Dim adapt As OleDb.OleDbDataAdapter Dim dscombo As DataSet conectaMDB = New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLED B.4.0;Data Source=D:\Archivo.mdb;Mode=Read;Persist Security Info=False") adapt = New OleDb.OleDbDataAdapter(varSQL, conectaMDB) dscombo = New DataSet 'Controla los errores de apertura de la base de datos Try conectaMDB.Open() adapt.Fill(dscombo) conectaMDB.Close() Catch ex As Exception MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error) Exit Function End Try Conecta = dscombo End Function Este código certifico que funciona porque yo lo he utilizado para incorporar unos datos a un AS/400. Espero que aclare las dudas. Si no es así la mejor forma de aclararlas es preguntar sin miedo. Un saludo Última edición por tolotoco; 05/01/2005 a las 01:17 Razón: Modificación del código |
| |||
Hola tolotoco me sigue sin salir, estoy haciendo una prueba con este código:
Código:
La idea de esta prueba era pasar toda la tabla al dataset, cambiar el campo observaciones de la primera fila y utilizar Update a ver si la actualizaba pero me sale el siguiente error:Dim dsDatos as new Dataset Dim da As New SqlDataAdapter("SELECT * FROM Proveedor", conex) dsDatos = New DataSet da.Fill(dsDatos, "Proveedor") dsDatos.Tables("Proveedor").Rows(0).Item("Observaciones") = "PRUEBA OBSERVACIONES" da.Update(dsDatos, "Proveedor") "Update requiere que UpdateCommand sea válido cuando se pasa la colección DataRow con filas modificadas." Que puedo hacer? :( |
| |||
Te falta un "detallito". Si quieres que el update sea automático debes crear un CommandBuilder y asignarle el DataAdapter de la siguiente forma: Dim cb as SqlCommandBuilder = New SqlCommandBuilder(da) Con eso es suficiente. Lo creas, lo enlazas con el DataAdapter y el sistema ya te hace el resto de forma automática. Si no haces ésto, entonces te toca crearlo tu de forma manual. Es decir, tienes que crear un Dataset nuevo, un DataRow, asignarle los datos línea a línea y, cuando ya estén introducidos todos los datos, hacer el update sobre la tabla de la base de datos. Espero haber aclarado tu duda. Ya me dirás como ha ido. Un saludo |