Pregunta

La cadena pasa a mi costumbre de la función es la siguiente:

SELECT key FROM ubis WHERE MemberID = '144'
AND To >='11/7/2009 9:11:23 pm'
AND From <= '11/7/2009 9:11:23 pm'

    Public Shared Function GetDataTable(ByVal CmdText As String) As DataTable
        Dim myConn As New SqlConnection(ConfigurationManager.ConnectionStrings("Conn").ConnectionString)
        Dim myCmd As New SqlCommand(CmdText, myConn)
        myConn.Open()
        Dim myReader As SqlDataReader = myCmd.ExecuteReader()
        Dim myTable As New DataTable()
        myTable.Load(myReader)
        myConn.Close()
        Return (myTable)
    End Function

y aquí está el error, Error de conversión al convertir datetime de cadena de caracteres

Entiendo que el de los campos de fecha y hora se pasan como una cadena en la función, pero ¿qué opciones tengo?

¿Fue útil?

Solución

Ha intentado ejecutar el SQL en el estudio de gestión y ver lo que sucede?

Otros consejos

Ha considerado el uso de una consulta parametrizada?Esto podría resolver su problema, y el rendimiento de seguridad adicional en el caso de que el WHERE condiciones de entrada del usuario.

Ejemplo (VB.NET):

Dim myCmd As New SqlCommand(CmdText, myConn)
myCmd.Parameters.AddWithValue("MemberID", 144)
myCmd.Parameters.AddWithValue("Timestamp", DateTime.Now)

Se utiliza con este texto de consulta (SQL):

SELECT key FROM ubis WHERE MemberID = @MemberID
AND @Timestamp BETWEEN From AND To

Off-topic:el BETWEEN palabra clave en el SQL es sólo una buena manera de expresar el >= AND <= condiciones.

Esto huele de una vulnerabilidad de inyección SQL. Esa fecha no lo hizo por casualidad venir del usuario (aunque sea indirectamente), ¿verdad? Incluso si éste es seguro, funciones genéricas como 'GetDataTable ()' que no tienen en cuenta los buenos parámetros de consulta son casi siempre un error.

¿Quieres algo más a esto:

Public Shared Function GetMemberKeys(ByVal MemberID As Integer, ByVal KeyDate As DateTime) As DataTable

    Static sql As String= _
         "SELECT key" _
      + " FROM ubis" _ 
      + " WHERE MemberID= @MemberID AND @KeyDate BETWEEN [FROM] AND [TO]"

    Dim dt As New DataTable()
    Using cn As New SqlConnection(ConfigurationManager.ConnectionStrings("Conn").ConnectionString), _
          cmd As New SqlCommand(sql, cn)

        cmd.Parameters.Add("@MemberID", SqlDbType.Int).Value = MemberID
        cmd.Parameters.Add("@KeyDate", SqlDbType.DateTime).Value = KeyDate

        cn.Open()
        Using rdr As SqlDataReader = cmd.ExecuteReader()
             dt.Load(rdr)
        End Using
    End Using
    Return dt
End Function

11/7/2009 es ambiguo - es que 11ª de julio o 7 º de de noviembre de

SQL no tiene forma de saber - y depende de los valores predeterminados que se ha configurado con. Sería mejor que pasar en la fecha en un formato sin ambigüedades:

SELECT key FROM ubis WHERE MemberID = '144' 
               AND To >='11 July 2009 9:11:23 pm' 
               AND From <= '11 July 2009 9:11:23 pm'

Alternativamente, utilizar la conversión correcta con el , o una uno personalizado , según lo sugerido por Zyphrax :

SELECT key FROM ubis WHERE MemberID = '144'
       AND To >= CONVERT(datetime, '11/7/2009 9:11:23 pm', 105)
       AND From <= CONVERT(datetime, '11/7/2009 9:11:23 pm', 105)

Puede utilizar el comando CONVERT para convertir el carbón a una fecha y hora.

SELECT key FROM ubis WHERE MemberID = '144'
           AND To >= CONVERT(datetime, '11/7/2009 9:11:23 pm', 105)
           AND From <= CONVERT(datetime, '11/7/2009 9:11:23 pm', 105)

No estoy seguro sobre el 105, puede que tenga que Google para el código de formato correcto.

Además, si su código SQL encuentra una excepción, su conexión no se cerrará. Es posible que desee añadir un poco de uso de código para solucionar este problema.

Public Shared Function GetDataTable(ByVal CmdText As String) As DataTable        
 Using myConn As New SqlConnection(ConfigurationManager.ConnectionStrings("Conn").ConnectionString)
   Using myCmd As New SqlCommand(CmdTxt, myConn)
     conn.Open()
       Using myReader As SqlDataReader = myCmd.ExecuteReader()
           Dim myTable As New DataTable()
           myTable.Load(myReader)
           myConn.Close()
           Return (myTable)  
      End Using
     End Using
End Function
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top