• Lunes 23 de Diciembre de 2024, 00:10

Autor Tema:  Error En Update Para Sql Server  (Leído 5403 veces)

junahu

  • Miembro activo
  • **
  • Mensajes: 97
    • Ver Perfil
Error En Update Para Sql Server
« en: Miércoles 5 de Abril de 2006, 02:41 »
0
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

junahu

  • Miembro activo
  • **
  • Mensajes: 97
    • Ver Perfil
Re: Error En Update Para Sql Server
« Respuesta #1 en: Lunes 10 de Abril de 2006, 20:28 »
0
Me faltaba:
            Dim cb As SqlCommandBuilder = New SqlCommandBuilder(daSQL)
despues de crear el da.

Ahora ya funciona. :whistling: