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?

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top