none
Problema Data Adapter RRS feed

  • Pregunta

  • Que tal, Hice una función para actualizar datos de una tabla en SQL Server que quedo asi, 

            

    Sub corrigue(ByVal connex As SqlClient.SqlConnection, ByVal esta As String, ByVal diaU As String, ByVal mesu As String, ByVal aniou As String, ByVal datos As String)

            Dim queryRellena As String = "select  dia, mes, anio, eva from datos where cve_estacion =" + esta + " and dia = " + diaU + " and mes = " + mesu + " and anio = " + aniou

            Dim DA As New SqlClient.SqlDataAdapter(queryRellena, connex)
            Dim DS As New DataSet

            DA.SelectCommand.CommandTimeout = 90

            DA.Fill(DS, "datos")  
            Dim cmdb As New SqlClient.SqlCommandBuilder(DA)


            With DS.Tables("datos")
                .Rows(0)("dia") = CInt(diaU)
                .Rows(0)("mes") = CInt(mesu)
                .Rows(0)("anio") = CInt(aniou)
                .Rows(0)("eva") = CDbl(datos)
            End With

            DA.Update(DS, "datos") <-punto donde genera el error

            cmdb.Dispose()
            DA.Dispose()
            DS.Dispose()

    End Sub

    Como pueden ver aumente el CommandTimeout porque tardaba en traer la consulta ya que son muchisimos datos, todo lo hace "bien" hasta el punto donde ejecuta  DA.Update(DS, "datos") lanzando una excepcion que me dice:  La generación SQL dinámica para UpdateCommand no es compatible con SelectCommand, que no devuelve ninguna información sobre columnas clave. 

    Que  error tengo y que podria hacer para resolverlo?, de antemano gracias


    ISC José Israel Casas F.

    jueves, 24 de mayo de 2012 15:38

Todas las respuestas

  • hola

    el primer el problema que veo es que no usas parametros

    deberia ser

    Dim queryRellena As String = "select  dia, mes, anio, eva from datos where cve_estacion = @esta and dia = @dia and mes = @mes and anio = @anio"
    
    Dim cmd As New SqlClient.SqlCommand(queryRellena, connex)
    
    cmd.Parameters.AddWithValue("@esta", esta)
    cmd.Parameters.AddWithValue("@dia", diaU )
    cmd.Parameters.AddWithValue("@mes", mesu)
    cmd.Parameters.AddWithValue("@aniou", aniou)
    
    Dim DA As New SqlClient.SqlDataAdapter(cmd)

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    jueves, 24 de mayo de 2012 16:39
  • el otro problema es que por el error pareciera que no defines un campo como key de la tabla

    por eso el SqlCommandBuilder no genera una instruccion de update correcta

    Dim update As String = Da.UpdateCommand

    puede ver que el UPDATE generaro es corecto?

    si haces


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    jueves, 24 de mayo de 2012 16:41
  • Hola Leandro,

    Primero gracias por tu ayuda, ya agregue los parámetros como me sugieres, ahora al correrlo paso por paso pues veo que los datos son los esperados, tome en cuenta, checar si la consulta es correcta (Ej: select  dia, mes, anio, eva from datos where cve_estacion = 1014 and dia = 28 and mes = 2 and anio = 1948) desde el manejador de base de datos y si ejecuta la consulta, dando los resultados que después quiero modificar, al correrlo ahora me genera esta excepción 

    ex = {"Update requiere que UpdateCommand sea válido cuando se pasa la colección DataRow con filas modificadas."}  

    Creo que entonces puede lo de comentas que no tengo un key para cada registro de la tabala, verdad?


    ISC José Israel Casas F.

    jueves, 24 de mayo de 2012 16:59
  • Creo que entonces puede lo de comentas que no tengo un key para cada registro de la tabala, verdad?

    el CommandBuilder requiere de una key en la tabla para poder identificar que registro afectar ante una modificacion

    mas alla que lo necesite o no, igualmente es muy importante definirlo


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    jueves, 24 de mayo de 2012 21:13