Frage

Die an meine benutzerdefinierte Funktion übergebene Zeichenfolge ist Folgendes:

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

Und hier ist der Fehler, den ich erhalte. Die Konvertierung ist beim Konvertieren von DateTime aus der Zeichenzeichenfolge fehlgeschlagen

Ich verstehe, dass die Felder der DateTime als Zeichenfolge in die Funktion übergeben werden, aber welche Optionen habe ich?

War es hilfreich?

Lösung

Haben Sie versucht, das SQL in Management Studio auszuführen und zu sehen, was passiert?

Andere Tipps

Haben Sie über eine parametrisierte Abfrage nachgedacht? Dies würde Ihr Problem lösen und eine zusätzliche Sicherheit in dem Fall liefern, in dem die WHERE Die Bedingungen werden von den Benutzereingaben entnommen.

Beispiel (vb.net):

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

Verwendet mit diesem Abfragetext (SQL):

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

Off-Topic: die BETWEEN Schlüsselwort in der SQL ist nur eine nette Möglichkeit, die auszudrücken >= AND <= Bedingungen.

Dies riecht nach einer SQL -Injektionsanfälligkeit. Dieses Datum kam zufällig vom Benutzer (sogar indirekt), oder? Auch wenn dieser sicher ist, sind generische Funktionen wie 'getDatable ()', die keine guten Abfrageparameter berücksichtigen, fast immer ein Fehler.

Sie wollen so etwas mehr wie folgt:

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

07.11.2009 ist mehrdeutig - ist das 11. Juli oder 7. November?

SQL hat keine Möglichkeit zu sagen - und es hängt von den Standardeinstellungen ab, mit denen es eingerichtet wurde. Es wäre besser, das Datum in einem eindeutigen Format zu verabschieden:

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'

Verwenden Sie alternativ die korrekte Konvertierung mit der richtigen Formatcode, oder ein benutzerdefinierte, wie von Zyphrax vorgeschlagen:

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)

Sie können den Befehl convert verwenden, um das Zeichen in eine DateTime umzuwandeln.

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)

Ich bin mir nicht sicher über die 105, Sie müssen möglicherweise Google für den richtigen Formatcode.

Wenn Ihr SQL -Code auf eine Ausnahme stößt, wird Ihre Verbindung nicht geschlossen. Möglicherweise möchten Sie ein wenig mithilfe von Code addieren, um dies zu beheben.

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top