Frage

Ich habe eine Datumsspalte in einem DB-Tabel, dass ich will ein Datum aus TextBox.Text genommen abgefragt werden. wählt der Benutzer aus dem Kalender im Format TT / MM / yyyy ein Datum. Ich möchte dieses Datum verwenden, um in eine Abfrage zu setzen. Wie kann ich das Datumsformat zu können, um die Datenbank abzufragen?

  Dim datefrom As String =txtDateFrom.Text
  Dim dateto As String =txtDateTo.Text

Die Abfrage wird wie folgt aussehen:

  WHERE (tblClient.ClientID = " & ClientID & ") AND (tblBackupArchive.BackupDate BETWEEN '" + datefrom + "' AND '" + dateto + "')"

Ich bin mit MS SQL Server btw. Jede mögliche Hilfe geschätzt.

Jonesy

War es hilfreich?

Lösung

NEVER USE STRING CONCATENATION wie das SIE BAUEN QUERIES !!!

Und ja, ich wollte schreien, weil Datumsformatierung die am wenigsten Ihrer Probleme ist. Stellen Sie sich vor, was in Ihrem aktuellen Code passieren würde, wenn etwas die folgende in eine Ihrer Datum Textfelder eingegeben:

  

'; DROP TABLE tblClient; -

Verwenden Sie stattdessen eine parametrisierte Abfrage. Das wird Ihr Datum Probleme beheben und zum Schutz vor SQL-Injection-Attacken. Hier ein Beispiel:

Dim sql As String = " .... WHERE tblClient.ClientID= @ClientID AND tblBackupArchive.BackupDate >= @DateFrom AND tblBackupArchive.Backupdate < @DateTo"

Using cn As New SqlConnection("your connection string here"), _
      cmd As New SqlCommand(sql, cn)

    cmd.Parameters.Add("@ClientID", SqlDbType.Int).Value = ClientID
    cmd.Parameters.Add("@DateFrom", SqlDbType.DateTime).Value = DateTime.Parse(txtDateFrom.Text)
    cmd.Parameters.Add("@DateTo", SqlDbType.DateTime).Value = DateTime.Parse(txtDateTo.Text).AddDays(1)

    cn.Open()

    cmd.Execute___()

End Using

Sie können nun daran denken, als ob Sie eine SQL-Anweisung mehr wie folgt ausführen hatte:

DECLARE @ClientID Int
DECLARE @DateFrom DateTime
DECLARE @DateTo DateTime

Set @ClientID = ImaginaryFunctionToGetQueryData('ClientID')
Set @DateFrom = ImaginaryFunctionToGetQueryData('DateFrom')
Set @DateTo   = ImaginaryFunctionToGetQueryData('DateTo')

SELECT ... 
FROM ... 
WHERE tblClient.ClientID= @ClientID 
    AND tblBackupArchive.BackupDate >= @DateFrom 
    AND tblBackupArchive.Backupdate < @DateTo

Der „ImaginaryFunction“ in diesem Code ausgeführt wird, um die Sp_executesql gespeicherte Prozedur, aber der Punkt ist, dass der Query-String, wie SQL Server gesehen wird Daten niemals direkt ersetzen in den Query-String. Code ist Code, Daten Daten sind, und nie die ‚entzwei soll erfüllen.

Andere Tipps

Nur als Ergänzung zu Joels Antwort ....

Ich würde vermeiden, überhaupt Strings in der Gleichung. IE; Sie nicht Textfelder verwenden, um die Daten zu speichern, verwenden Sie die richtigen Kalender oder datetimepickers.

Auf diese Weise werden Sie nicht, dies zu tun haben;

cmd.Parameters.Add("@DateFrom", SqlDbType.DateTime).Value = DateTime.Parse(txtDateFrom.Text)

als Joel schlägt vor, sondern können Sie einfach tun;

cmd.Parameters.Add("@DateFrom", SqlDbType.DateTime).Value = dtDateFrom.value

Auf diese Weise Ihr nicht angewiesen auf die DateTime.Parse tatsächlich das richtige Format aus der Zeichenfolge Kommissionierung. Und Sie werden nur mit Datum Typen sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top