Fecha de análisis de VB.NET para SQL INSERT

Tengo una aplicación web con un formulario que estoy tratando de pasar a un servidor ASP.NET (usando VB.NET) y luego a una tabla de MS SQL Server. El formulario utiliza un selector de fecha jQuery en varios cuadros de texto y los formatea como MM/dd/yyyy. Los campos del formulario luego se pasan a través de un PageMethod al servidor web que toma los diversos valores de campo y los combina en un comando SQL UPDATE.

Constantemente recibo el siguiente error cada vez que intento ejecutar el comando SQL:

Conversion failed when converting date and/or time from character string.

Aquí está el código en el servidor:

Using myConn As New System.Data.SqlClient.SqlConnection(CString.ConnectionString)
    myConn.Open()

    Dim cmd As New System.Data.SqlClient.SqlCommand("UPDATE table " & _
                             "SET type = '" & type & "', " & _ 
                                 "target = '" & "@target" & "', " & _
                                 "patient = '" & patient & "', " & _
                                 "dob = '" & "@dob" & "' " & _   
                             "WHERE serial = '" & serial & "'", myConn)


    cmd.Parameters.Add(SqlParameter("@target", Data.SqlDbType.Date))       
    cmd.Parameters.Add(SqlParameter("@dob", Data.SqlDbType.Date))

    If target = "" Then
        cmd.Parameters("@target").Value = Data.SqlTypes.SqlDateTime.Null
    Else
        cmd.Parameters("@target").Value = target
    End If

    If dob = "" Then
        cmd.Parameters("@dob").Value = Data.SqlTypes.SqlDateTime.Null
    Else
        cmd.Parameters("@dob").Value = dob
    End If

    cmd.ExecuteNonQuery()

End Using

Nota: He probado unas veinte formas diferentes de analizar las fechas, convertirlas en fechas, cambiar los formatos y ninguna de ellas ha funcionado.

Nota 2: Las declaraciones condicionales al final son simplemente para evitar que los campos de fecha vacíos se almacenen en la base de datos SQL como "1/1/1900", sino más bien como un valor NULL SQL real. Sin embargo, desde la depuración, parece que este no es el problema, es cuando hay un valor real que se activa el error.

Si alguien puede ver lo que estoy haciendo mal y cómo puedo solucionarlo, se lo agradecería mucho. ¡Gracias de antemano por tu ayuda!

preguntado el 01 de febrero de 12 a las 14:02

2 Respuestas

Está mezclando sus partes parametrizadas y no parametrizadas (¿por qué no parametriza todo?)

Dim cmd As New System.Data.SqlClient.SqlCommand("UPDATE table " & _
                         "SET type = '" & type & "', " & _ 
                             "target = @target, " & _
                             "patient = '" & patient & "', " & _
                             "dob = @dob " & _   
                         "WHERE serial = '" & serial & "'", myConn)

Respondido 01 Feb 12, 18:02

No estaba seguro de que eso hiciera una diferencia. Pero acabas de resolver mi problema. Todavía estaba poniendo comillas simples alrededor de los parámetros (que originalmente no eran parámetros, solo variables de cadena almacenadas). Lo cambié y funcionó a las mil maravillas. Creo que también parametrizaré todo. ¡Gracias por tu ayuda! - mbeasley

@mbeasley Puede mezclarlos, pero target = '@target' está estableciendo target igual a una cadena literal que contiene "@target", porque SQL lo ve como un literal. Los parámetros @ no son puntos de inserción que simplemente se reemplazan. - Cade Roux

Derecha. Eso es lo que terminé arreglando y funcionó perfectamente. Error tonto por mi parte, pero aprendí la lección. Aprecio tu ayuda. - mbeasley

¿Incluyes tiempo? Los campos de fecha y hora requieren fecha y hora.

Respondido 01 Feb 12, 18:02

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.