Guardar datos con ADO.Net

29/08/2006 - 13:23 por Roberto | Informe spam
Hola a todos.

Tengo un problema al grabar los cambios de un DataSet en una base de datos
de Access 2000 con ADO.Net.

Para empezar el error es: UPDATE no puede encontrar TableMaping'Table' o
DataTable'Table'.

La ayuda general dice que para este error puede no generarse bien el
commandbuder si la SELECT que llena el DataAdapter tiene pocos datos o
INNERJOINs o las tablas no tienen clave principal. Más adelante vereis que
uso una SELECT * de lo más simple para llenar el DataAdapter, los nombres de
las tablas están bien y todas tienen clave principal.

Me hice una función a la que le paso por referencia el DataSet y el
DataAdapter, ya la he utilizado con otro DataSet y me funcionó perfectamente:

Public Function GuardarCambiosDS(ByRef ds As DataSet, ByRef da As
OleDbDataAdapter) As Boolean
Dim cb As New OleDbCommandBuilder(da)

'He probado a recuperar los comandos del CommandBuilder por lo que
dice la ayuda pero tampoco es esto.
da.UpdateCommand = cb.GetUpdateCommand
da.InsertCommand = cb.GetInsertCommand
da.DeleteCommand = cb.GetDeleteCommand

Try
da.Update(ds)
ds.AcceptChanges()
Return True
Catch ex As Exception
Return False
End Try
End Function

El Dataset lo relleno así:
Dim MiC As OleDbConnection
Dim MiDA As OleDbDataAdapter
Dim MiDS As DataSet
Dim dr As DataRow

MiC = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data
Source=" & FICHERO.MDB & "; Jet OLEDB:Database Password=" & pswBaseDeDatos &
";")

'Tiene cuatro tablas, he probado tanto poniendo las cuatro como con la que
voy a actualizar en este momento unicamente.
MiDA = New OleDbDataAdapter("SELECT * FROM Cabecera", MiC)
MiDA.Fill(MiDS, "Cabecera")
MiDA = New OleDbDataAdapter("SELECT * FROM Descripcion", MiC)
MiDA.Fill(MiDS, "Descripcion")
MiDA = New OleDbDataAdapter("SELECT * FROM Formas", MiC)
MiDA.Fill(MiDS, "Formas")
MiDA = New OleDbDataAdapter("SELECT * FROM Cancelaciones", MiC)
MiDA.Fill(MiDS, "Cancelaciones")

'Añado un nuevo registro:
dr = MiDS.Tables("Cabecera").NewRow
dr.Item("Numero") = Numero
MiDS.Tables("Cabecera").Rows.Add(dr)

'Llamo a la función para guardarlo.
If GuardarCambiosDS(MiDS, MiDA) Then
MiDA.Dispose()
MiC.Close()
End If
 

Leer las respuestas

#1 Roberto
29/08/2006 - 16:21 | Informe spam
De momento puedo guardar los datos desde un DataTable. He hecho una función
igual a la anterior pero pasándole un objeto DataTable en lugar del DataSet,
pero me vendría bien poder hacerlo con todo el DataSet completo para ir
rellenando las diferentes tablas a cada paso y guardarlas todas juntas al
confirmar al final del proceso.

"Roberto" wrote:

Hola a todos.

Tengo un problema al grabar los cambios de un DataSet en una base de datos
de Access 2000 con ADO.Net.

Para empezar el error es: UPDATE no puede encontrar TableMaping'Table' o
DataTable'Table'.

La ayuda general dice que para este error puede no generarse bien el
commandbuder si la SELECT que llena el DataAdapter tiene pocos datos o
INNERJOINs o las tablas no tienen clave principal. Más adelante vereis que
uso una SELECT * de lo más simple para llenar el DataAdapter, los nombres de
las tablas están bien y todas tienen clave principal.

Me hice una función a la que le paso por referencia el DataSet y el
DataAdapter, ya la he utilizado con otro DataSet y me funcionó perfectamente:

Public Function GuardarCambiosDS(ByRef ds As DataSet, ByRef da As
OleDbDataAdapter) As Boolean
Dim cb As New OleDbCommandBuilder(da)

'He probado a recuperar los comandos del CommandBuilder por lo que
dice la ayuda pero tampoco es esto.
da.UpdateCommand = cb.GetUpdateCommand
da.InsertCommand = cb.GetInsertCommand
da.DeleteCommand = cb.GetDeleteCommand

Try
da.Update(ds)
ds.AcceptChanges()
Return True
Catch ex As Exception
Return False
End Try
End Function

El Dataset lo relleno así:
Dim MiC As OleDbConnection
Dim MiDA As OleDbDataAdapter
Dim MiDS As DataSet
Dim dr As DataRow

MiC = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data
Source=" & FICHERO.MDB & "; Jet OLEDB:Database Password=" & pswBaseDeDatos &
";")

'Tiene cuatro tablas, he probado tanto poniendo las cuatro como con la que
voy a actualizar en este momento unicamente.
MiDA = New OleDbDataAdapter("SELECT * FROM Cabecera", MiC)
MiDA.Fill(MiDS, "Cabecera")
MiDA = New OleDbDataAdapter("SELECT * FROM Descripcion", MiC)
MiDA.Fill(MiDS, "Descripcion")
MiDA = New OleDbDataAdapter("SELECT * FROM Formas", MiC)
MiDA.Fill(MiDS, "Formas")
MiDA = New OleDbDataAdapter("SELECT * FROM Cancelaciones", MiC)
MiDA.Fill(MiDS, "Cancelaciones")

'Añado un nuevo registro:
dr = MiDS.Tables("Cabecera").NewRow
dr.Item("Numero") = Numero
MiDS.Tables("Cabecera").Rows.Add(dr)

'Llamo a la función para guardarlo.
If GuardarCambiosDS(MiDS, MiDA) Then
MiDA.Dispose()
MiC.Close()
End If

Preguntas similares