Hola amigos, estoy creando un ejemplo con Access y SQL Server. El problema me ocurre cuando quiero actualizar los datos cuando estoy en SQLServer.
Me da el error:
Update requiere que UpdateCommand sea válido cuando se pasa la colección DataRow con filas modificadas
De la misma forma si lo pruebo con Access funciona bien.
Os comento lo que estoy haciendo:
Tengo dos formularios, uno frmBase y otro frmPrimero. Además en una clase (en una biblioteca de clases) llamada ClaseBD donde creo las conexiones a Access y a SQL Server.
Al iniciar, en un archivo adjunto le he dicho si quiero trabajar con una BD de Access o con SQL Server.
Si le he dicho que trabaje con Access, pues lee las tuplas de una tabla de la BD de access y las mete en un DataGrid que se encuentra en frmPrimero.
Si modifico algún valor, al salir lo actualiza y va bien.
Pero si hago todo esto en SQL Server, lo lee en el DataGrid (todo igual) y cuando modifico algo, al actualizar me da el error que os indiqué al principio.
Todo el código de los Connection, DataTable, DataAdapter y DataSet están en la clase ClaseBD. Y accedo a ella desde los formularios.
Os doy el código de la claseDB (os la he hecho más extensa para que la veáis mejor (espero) y habrá algunas líneas que son partes de mi proyecto que no vienen al caso):
Imports System.Data.OleDb
Imports System.Data.SqlClient
Imports System.IO
Public Class ClaseBD
Public LineA(4) As String
Private DirActivo As String = Directory.GetCurrentDirectory
Private nombreColumna As String
Private nombreTabla As String
Public conn As OleDbConnection
Public conn1 As SqlConnection
Public dt As DataTable
Public da, da1, da2 As OleDbDataAdapter
Public daSQL, daSQL1, daSQL2 As SqlDataAdapter
Public ds, ds1, ds2 As DataSet
Public AccessSQLserver As Boolean = False
Public Sub New()
LeerConfig()
nombreTabla = LineA(2).Substring(LineA(2).LastIndexOf("=") + 1)
If LineA(1) = "Provider=Microsoft.Jet.OLEDB.4.0" Then AccessSQLserver = False Else AccessSQLserver = True
Dim FI As New FileInfo(nombreTabla)
nombreTabla = FI.Name
''Si usamos Access
Try
If AccessSQLserver = False Then 'Si usamos Access
''Activar el conn, da y ds
conn = New OleDbConnection(LineA(1) & ";" & LineA(2))
CrearDS()
Else ''Si usamos SQL Server
Dim connTXT As String = LineA(1) & ";" & LineA(2) & ";Integrated Security=SSPI"
Me.conn1 = New SqlConnection(connTXT)
CrearDS()
End If
Catch ex As Exception
MsgBox("error1")
End Try
End Sub
''Crear DA y DS
Public Sub CrearDS()
'Access
If LineA(1) = "Provider=Microsoft.Jet.OLEDB.4.0" Then
da = New OleDbDataAdapter("select * from clientes", conn)
ds = New DataSet
ds.Clear()
'
da.Fill(ds, "clientes")
Me.conn.Close()
Else ' SQL Server
daSQL = New SqlDataAdapter("select ntomador,apellido from clientes", conn1)
ds = New DataSet
ds.Clear()
'
Try
daSQL.Fill(ds, "clientes")
Me.conn1.Close()
Catch ex As Exception
MsgBox("SQL Server no está activo.", MsgBoxStyle.Critical, "Error de SQL Server")
End Try
End If
End Sub
'
''DataTable
Public Function ListarTupla(ByVal tabla As String, ByVal columna As String, ByVal id As Integer)
Dim vista As New DataView
vista.Table = ds.Tables(tabla)
vista.RowFilter = columna & "=" & id
vista.Sort = "idcliente"
If vista.Count = 0 Then MsgBox("Vacía")
Return vista
End Function
'
''Actualizar Base de Datos
Public Sub ActualizaBD(ByVal ventana As String)
If AccessSQLserver = False Then 'Access
If ds.HasChanges Then
If modificamosSiNo() Then Exit Select
Dim cb As New OleDbCommandBuilder(da)
da.UpdateCommand = cb.GetUpdateCommand
da.Update(ds, "clientes")
End If
Else 'SQL Server
If ds.HasChanges Then
'
'If modificamosSiNo() Then Exit Select
'
'Dim cb As New SqlCommandBuilder(daSQL)
'daSQL.UpdateCommand = cb.GetUpdateCommand
'
daSQL.Update(ds, "clientes")
End If
End If
End If
End Sub
'
'¿Actualizamos las modificaciones?
Private Function modificamosSiNo()
Dim Respuesta As MsgBoxResult
Respuesta = MsgBox("Algun dato a cambiado, " & Chr(13) & "¿Quieres modificar (SI) o no actualizar los valores (NO)? ", MsgBoxStyle.YesNo, "Asunto importante")
If Respuesta = MsgBoxResult.No Then
Return True
Else
Return False
End If
End Function
'
Public Sub LeerConfig()
Dim FI As String = DirActivo & "\FileIni.ini"
Dim FS As New FileStream(FI, FileMode.Open)
Dim SR As New StreamReader(FS)
Dim i As Integer = -1
Do
i += 1
LineA(i) = SR.ReadLine
Loop While (LineA(i) <> "")
SR.Close()
End Sub
End Class
No se si os he liado, pero es que no consigo encontrar la solución (y llevo buscando por Internet varios días).
Gracias