Error de conversión al convertir datetime de cadena de caracteres
-
12-09-2019 - |
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?
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