La conversion a échoué lors de la conversion datetime de chaîne de caractères
-
12-09-2019 - |
Question
La chaîne passée à ma fonction personnalisée est la suivante:
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
et est l'erreur ici que je reçois, La conversion a échoué lors de la conversion datetime de chaîne de caractères
Je comprends que les champs datetime sont passés sous forme de chaîne dans la fonction, mais quelles sont les options dois-je?
La solution
Avez-vous essayé de courir le sql en studio de gestion et de voir ce qui se passe?
Autres conseils
Avez-vous envisagé d'utiliser une requête paramétrées? Cela résoudrait votre problème, et le rendement a ajouté la sécurité dans le cas où les conditions de WHERE
sont prises d'entrée de l'utilisateur.
Exemple (VB.NET):
Dim myCmd As New SqlCommand(CmdText, myConn)
myCmd.Parameters.AddWithValue("MemberID", 144)
myCmd.Parameters.AddWithValue("Timestamp", DateTime.Now)
Utilisé avec ce texte de requête (SQL):
SELECT key FROM ubis WHERE MemberID = @MemberID
AND @Timestamp BETWEEN From AND To
Hors-sujet:. Le mot-clé BETWEEN
dans le SQL est juste une belle façon d'exprimer les conditions de >= AND <=
Cela sent d'une vulnérabilité d'injection SQL. Cette date n'a pas par hasard proviennent de l'utilisateur (même indirectement), l'a fait? Même si celui-ci est sûr, les fonctions génériques comme « GetDataTable () » qui ne tiennent pas compte de bons paramètres de requête sont presque toujours une erreur.
Vous voulez quelque chose comme ceci:
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 est ambigu - est que le 11 de Juillet ou le 7 Novembre
SQL n'a aucun moyen de dire - et cela dépend des valeurs par défaut, il a été configuré avec. Il serait préférable de passer à la date dans un format sans ambiguïté:
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'
Vous pouvez également utiliser la conversion correcte avec le code de format correct ou personnalisée un , comme suggéré par 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)
Vous pouvez utiliser la commande convert pour convertir le charbon à un datetime.
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)
Je ne suis pas sûr de la 105, vous pourriez avoir à Google pour le bon code de format.
En outre, si votre code SQL rencontre une exception, la connexion ne sera pas fermée. Vous pouvez ajouter un peu d'aide du code pour résoudre ce problème.
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