Foros del Web » Programación para mayores de 30 ;) » .NET »

Insertar todos los datos de un dataset en una BD

Estas en el tema de Insertar todos los datos de un dataset en una BD en el foro de .NET en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 31/12/2004, 02:54
 
Fecha de Ingreso: marzo-2004
Ubicación: Valencia
Mensajes: 367
Antigüedad: 20 años, 1 mes
Puntos: 1
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.
  #2 (permalink)  
Antiguo 04/01/2005, 01:07
 
Fecha de Ingreso: febrero-2004
Ubicación: Granada
Mensajes: 26
Antigüedad: 20 años, 2 meses
Puntos: 0
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.
  #3 (permalink)  
Antiguo 04/01/2005, 06:42
 
Fecha de Ingreso: marzo-2004
Ubicación: Valencia
Mensajes: 367
Antigüedad: 20 años, 1 mes
Puntos: 1
Sólo con eso no me va, puedes poner un ejemplo?

Gracias y un saludo.
  #4 (permalink)  
Antiguo 05/01/2005, 01:16
 
Fecha de Ingreso: febrero-2004
Ubicación: Granada
Mensajes: 26
Antigüedad: 20 años, 2 meses
Puntos: 0
Información

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
  #5 (permalink)  
Antiguo 05/01/2005, 02:54
 
Fecha de Ingreso: marzo-2004
Ubicación: Valencia
Mensajes: 367
Antigüedad: 20 años, 1 mes
Puntos: 1
Hola tolotoco me sigue sin salir, estoy haciendo una prueba con este código:

Código:
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")
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:
"Update requiere que UpdateCommand sea válido cuando se pasa la colección DataRow con filas modificadas."


Que puedo hacer? :(
  #6 (permalink)  
Antiguo 07/01/2005, 01:13
 
Fecha de Ingreso: febrero-2004
Ubicación: Granada
Mensajes: 26
Antigüedad: 20 años, 2 meses
Puntos: 0
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
  #7 (permalink)  
Antiguo 09/01/2005, 12:21
 
Fecha de Ingreso: marzo-2004
Ubicación: Valencia
Mensajes: 367
Antigüedad: 20 años, 1 mes
Puntos: 1
Ahora sí me funcionó

Muchas gracias tolotoco.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:23.