2016-04-04 7 views
-2

Ich versuche, meine Datenbank basierend auf dem aktuellen Benutzer und dem aktuellen Datum abzufragen. Ich bekomme derzeit keine Ergebnisse von meiner Abfrage und ich denke, das Problem ist mit meiner Formatierung des aktuellen Datums in vb.net. Die Abfrage wieaktuelles Datum als Suchparameter über vb.net in mysql verwenden

query = "SELECT movie_name from movie2 Where movie_id=(SELECT movie_id from rental where client_username='" & currentUser & "' AND start_date<='" & Format(Now, "yyyy-MM-dd") & "' AND return_date>='" & Format(Now, "yyyy-MM-dd") & "')" 

Ich weiß, der Rest der Abfrage funktioniert (außer Current Aufruf), wie ich es auf dem MySQL-Server getestet haben. Ich habe currentUser vorher aufgerufen, was durch eine Variable in einem Modul gespeichert wird, ohne irgendwelche Probleme, so dass ich das Gefühl habe, dass das Problem bei meinen Daten liegen muss. Ich weiß nicht, wie man das aktuelle Datum formatiert, damit mySql es richtig empfängt? Ich habe auch versucht, den Code

query = "SELECT movie_name from movie2 Where movie_id=(SELECT movie_id from rental where client_username='" & currentUser & "' AND start_date<='" & DateTime.Now.ToString("yyyy-MM-dd") & "' AND return_date>='" & DateTime.Now.ToString("yyyy-MM-dd") & "')" 

ohne Erfolg. Jede Hilfe würde sehr geschätzt werden! Danke, Alan.

+1

Ja, aber das Problem shoul mit einer parameterzied Abfrage festgelegt werden – Steve

Antwort

3

Das Problem ist die übliche schlechte Praxis Zeichenfolge Verkettung beim Erstellen von SQL-Befehl verwenden.
Und das Heilmittel ist immer das Gleiche. Eine parametrisierte Abfrage.

query = "SELECT movie_name from movie2 Where movie_id=" & _ 
     "(SELECT movie_id from rental where [email protected]" &_ 
     " AND start_date<[email protected] AND return_date>[email protected]" 
Using cmd = new MySqlCommand(query, connection) 
    cmd.Parameters.Add("@name", MySqlDbType.VarChar).Value = currentUser 
    cmd.Parameters.Add("@date", MySqlDbType.DateTime).Value = DateTime.Now 
    Using reader = cmd.ExecuteReader() 
     .... now read your data .... 
    End Using 
End Using 

Mit String-Verkettung sind Sie anfällig für Sql Injection und wenn die Umwandlung von Dezimalzahlen oder das Datum in eine Zeichenfolge zwingen Sie sind ein leichtes Opfer von falschen Konvertierungen. Parameter vermeiden all die

EDIT: Mit einem MySqlDataAdapter

query = "SELECT movie_name from movie2 Where movie_id=" & _ 
     "(SELECT movie_id from rental where [email protected]" &_ 
     " AND start_date<[email protected] AND return_date>[email protected]" 
Using cmd = new MySqlCommand(query, connection) 
    cmd.Parameters.Add("@name", MySqlDbType.VarChar).Value = currentUser 
    cmd.Parameters.Add("@date", MySqlDbType.DateTime).Value = DateTime.Now 
    Using adapter = new MySqlDataAdapter(cmd) 
     Dim dt = new DataTable() 
     adapter.Fill(dt) 
    End Using 
End Using 
+0

ich die Daten durch einen Datenrahmen angezeigt werden soll, so war ich einen MySqlDataAdapter mit eher als ein Leser, wie würde ich den Code ändern, um dies zu tun? –

+0

In diesem Fall könnten Sie den Konstruktor MySqlDataAdapter verwenden, der einen MySqlCommand übernimmt und den oben vorbereiteten Befehl übergibt, anstatt einen MySqlDataReader zu erstellen/zu verwenden. – Steve

+1

das hat mir geholfen! Danke @Steve .. – matzone