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