none
Error en consulta

    Pregunta

  • Buenos dias.

    Tengo esta consulta para recoger datos de dos tablas:

     Dim Sql As String = String.Empty
                Sql = " UPDATE ServiciosAsitur a, ServiciosAsiturDetalle b "
                Sql += "SET a.FechaEntrada= '" & FechaEntradaDateTimePicker.Value & "',"
                Sql += " a.FechaActuacion= '" & FechaActuacionDateTimePicker.Value & "',"
                Sql += " a.CodCliente= '" & CodClienteTextBox.Text & "',"
                Sql += " a.CodOperario= '" & CodOperarioTextBox.Text & "',"
                Sql += " a.CodPerito= '" & CodPeritoTextBox.Text & "',"
                Sql += " a.DetalleProblema= '" & DetalleProblemaTextBox.Text & "',"
                Sql += " a.SolucionProblema= '" & SolucionProblemaTextBox.Text & "',"
     
                If ParteTerminadoCheckBox.Checked = True Then
                    Sql += " a.ParteTerminado= " & True & ","
                Else
                    Sql += " a.ParteTerminado= " & False & ","
                End If
     
                'Sql += " ParteTerminado= '" & ParteTerminadoCheckBox.Checked & "',"
                Sql += " a.Compañia= '" & CompañiaTextBox.Text & "',"
                Sql += " a.NumeroPoliza= '" & NumeroPolizaTextBox.Text & "',"
                Sql += " a.RefAsitur= '" & RefAsiturTextBox.Text & "',"
                Sql += " a.TipoSiniestro= '" & TipoSiniestroTextBox.Text & "',"
                Sql += " a.Causa= '" & CausaTextBox.Text & "',"
                Sql += " a.Observaciones= '" & ObservacionesTextBox.Text & "',"
                Sql += " a.CodColaborador= '" & CodColaboradorTextBox.Text & "', "
                Sql += " a.CodArticulo= '" & CodArticuloTextBox.Text & "'"
                Sql += " b.SubTotal= '" & SubTotalTextBox.Text & "',"
                Sql += " b.TotalIva= '" & TotalIvaTextBox.Text & "',"
                Sql += " b.TotalServicio= '" & TotalMaterialTextBox.Text & "',"
                Sql += " b.HoraEntrada= '" & HoraEntradaDateTimePicker.Text & "',"
                Sql += " b.HoraSalida= '" & HoraSalidaDateTimePicker.Text & "',"
                Sql += " b.TotalHoras= '" & TotalHorasTextBox.Text & "',"
                Sql += " WHERE a.NumOrden = '" & NumOrdenTextBox.Text & "'"

    Con esta consulta me marca error en la sintaxis, falta operador en en la expresion de consulta b.Subtotal=

    Podiais echarme una mano.

    Un saludo y gracias


    jose soler

    lunes, 12 de marzo de 2012 11:03

Respuestas

  • hola

    el principal problema que tienes no es el error en si mismo, sino que es mas de fondo, no debs armar la query concatenendo el string

    deberia usar parametros

    Using cn As New SqlConnection("connection string")
        cn.Open()
    
        Dim query As String = "UPDATE ServiciosAsitur a SET a.FechaEntrada= @FechaEntrada, " & _
                             "a.FechaActuacion=@FechaActuacion, .... " & _
                               "WHERE a.NumOrden =  @NumOrden"
    
        Dim cmd As New SqlCommand(query, cn)
    
        cmd.Parameters.AddWithValue("@FechaEntrada", FechaEntradaDateTimePicker.Value)
        cmd.Parameters.AddWithValue("@FechaActuacion", FechaActuacionDateTimePicker.Value)
    
        .
    
        .
    
        cmd.Parameters.AddWithValue("@NumOrden", NumOrdenTextBox.Text)
    
        cmd.ExecuteNonQuery()
    End Using

    como veras no se concatena el string, se usa la coleccion Parameters

    ademas no creo que puedas en una misma instruccion UPDATE actualizar dos tabla, deberias ahcerlo en dos UPDATE separados

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    lunes, 12 de marzo de 2012 11:46
  •   Sql += " a.CodArticulo= '" & CodArticuloTextBox.Text & "'"

    En esta linea te falta una coma al final.

    Para comprobar este tipo de errores te recomendaría que pongas un punto de interrupción cuando la cadena ya esté formada para ver su contenido(a ser posible copiarlo a cualquier editor de texto y  verificar con detenimiento la cadena.)

     


    daviel



    lunes, 12 de marzo de 2012 11:23
  • HOO, al hacerlo mediante concatenación de cadenas puedes evitar tambien las injecciones sql, pero es algo más complejo y por cierto no necesariamente debe ser diseño web, tambien en aplicaciones de escritorio puedes hacer injecciones sql.

    Problemas con decimales y Fechas??? con decimales solo con cambiar la coma por el punto te funciona, y las fechas al insertarlas poner comillas simples como string(nvarchar,char....etc) te funciona también, pero si veo más comodo y practico no tener preocuparme en ningun momento de dichos caracteres.

    Gracias, he entendido el porque de usar parámetros(evitar pequeños descuidos del programador,que pueden llevar consecuencias catastroficas)

    Editado:

          Sub Ejecuta_Comando(ByVal SQL As String, ByVal campos As Hashtable, ByVal values As Hashtable)
                Dim Comando As New OleDbCommand
                With Comando
                    .Connection = Cn
                    .CommandText = SQL
                    For Each cb As DictionaryEntry In campos
                        .Parameters.Add(New OleDbParameter(cb.Key.ToString, CType(cb.Value, OleDbType))).Value = values(cb.Key)
                    Next
                End With
            End Sub

    Para hacerlo algo más automático el tema de los parámetros. Primero le paso la consulta SQL, luego un hastable con la key por nombre_param(@parametro1,@parm2...etc), y por value el tipo de datos, luego el segundo hastable que le paso tiene por key el nombre del parmametro y el value sería el valor que deseo añadir


    daviel



    lunes, 12 de marzo de 2012 13:31

Todas las respuestas

  •   Sql += " a.CodArticulo= '" & CodArticuloTextBox.Text & "'"

    En esta linea te falta una coma al final.

    Para comprobar este tipo de errores te recomendaría que pongas un punto de interrupción cuando la cadena ya esté formada para ver su contenido(a ser posible copiarlo a cualquier editor de texto y  verificar con detenimiento la cadena.)

     


    daviel



    lunes, 12 de marzo de 2012 11:23
  • hola

    el principal problema que tienes no es el error en si mismo, sino que es mas de fondo, no debs armar la query concatenendo el string

    deberia usar parametros

    Using cn As New SqlConnection("connection string")
        cn.Open()
    
        Dim query As String = "UPDATE ServiciosAsitur a SET a.FechaEntrada= @FechaEntrada, " & _
                             "a.FechaActuacion=@FechaActuacion, .... " & _
                               "WHERE a.NumOrden =  @NumOrden"
    
        Dim cmd As New SqlCommand(query, cn)
    
        cmd.Parameters.AddWithValue("@FechaEntrada", FechaEntradaDateTimePicker.Value)
        cmd.Parameters.AddWithValue("@FechaActuacion", FechaActuacionDateTimePicker.Value)
    
        .
    
        .
    
        cmd.Parameters.AddWithValue("@NumOrden", NumOrdenTextBox.Text)
    
        cmd.ExecuteNonQuery()
    End Using

    como veras no se concatena el string, se usa la coleccion Parameters

    ademas no creo que puedas en una misma instruccion UPDATE actualizar dos tabla, deberias ahcerlo en dos UPDATE separados

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    lunes, 12 de marzo de 2012 11:46
  • leandro, no me había fijado que está haciendo un update a 2 tablas a la ves.. no se decirte si funciona eso. Estás indicando que la mejor forma de hacer los update es mediante patrametros, en vez de concatenar una cadena?, ya que concatenando cadenas se puede hacer sin problema alguno. ¿Que diferencia o ventaja existe en hacerlo por parametros?


    daviel

    lunes, 12 de marzo de 2012 12:33
  • la mejor forma de hacer los update es mediante patrametros, en vez de concatenar una cadena?

    claro, es que no hay alternativas por mas que funcionen ambas la correcta es con parametros, muchas veces que funcione no quiere decir que este bien

    basicamente los parametros se usan por: la resoluciondel tipo de dato, no necesitas definir comillas para los tipos de datos y no tendras problemas con decimales y fechas

    ademas es una buena practica porque si revisas ambas opciones la de parametros queda mucho mas legible

    sin contar que si estarias en un desarrollo web evitarias uno de los principales ataques que es el sql injection

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    lunes, 12 de marzo de 2012 12:38
  • HOO, al hacerlo mediante concatenación de cadenas puedes evitar tambien las injecciones sql, pero es algo más complejo y por cierto no necesariamente debe ser diseño web, tambien en aplicaciones de escritorio puedes hacer injecciones sql.

    Problemas con decimales y Fechas??? con decimales solo con cambiar la coma por el punto te funciona, y las fechas al insertarlas poner comillas simples como string(nvarchar,char....etc) te funciona también, pero si veo más comodo y practico no tener preocuparme en ningun momento de dichos caracteres.

    Gracias, he entendido el porque de usar parámetros(evitar pequeños descuidos del programador,que pueden llevar consecuencias catastroficas)

    Editado:

          Sub Ejecuta_Comando(ByVal SQL As String, ByVal campos As Hashtable, ByVal values As Hashtable)
                Dim Comando As New OleDbCommand
                With Comando
                    .Connection = Cn
                    .CommandText = SQL
                    For Each cb As DictionaryEntry In campos
                        .Parameters.Add(New OleDbParameter(cb.Key.ToString, CType(cb.Value, OleDbType))).Value = values(cb.Key)
                    Next
                End With
            End Sub

    Para hacerlo algo más automático el tema de los parámetros. Primero le paso la consulta SQL, luego un hastable con la key por nombre_param(@parametro1,@parm2...etc), y por value el tipo de datos, luego el segundo hastable que le paso tiene por key el nombre del parmametro y el value sería el valor que deseo añadir


    daviel



    lunes, 12 de marzo de 2012 13:31