2016-06-20 6 views
-1

Ich habe diese Anfrage:C# | MySQL-Abfrage in DB arbeiten arbeitet nicht in Anwendung

string query = "SELECT afspraak_locatie FROM Afspraak WHERE date(datum) = '" + datum +"'"; 

Die letzte Abfrage wie folgt aussehen:

SELECT afspraak_locatie FROM Afspraak WHERE date(datum) = '2016-06-16' 

Wenn ich die Abfrage in meinem PHPMYADMIN ausführen gibt es die Zeile . Aber wenn ich es in C# zu tun, sagt es mein MySqlDataReader leer

Hier ist der Code i dafür verwenden:

MySqlCommand cmd1 = new MySqlCommand(query1, connection); 
cmd1.CommandType = CommandType.Text; 
using (MySqlDataReader reader1 = cmd1.ExecuteReader()) 
{ 
     while (reader1.Read()) 
     { 
      result1.Add(reader1.GetString(0)); 
     } 
     reader1.Close(); 
} 
cmd1.Cancel(); 

Wenn dies ausgeführt wird es eine System.NullReferenceException auf die While (Reader1 geben. lesen) Teil. Irgendwelche Lösungen?

+3

Verwenden Sie SQL-Parameter anstelle von String-Verkettung. Wenn Sie eine 'NullReferenceException'' result1' erhalten, ist null, was eine 'List ' zu sein scheint, verwenden Sie also 'var result1 = new Liste ();' –

+4

Nun, das erste, was zu tun ist, Ihre Abfrage so zu bauen . Verwenden Sie parametrisiertes SQL. Beachten Sie, dass Sie aufgrund der 'using'-Anweisung nicht' Close' auf Ihrem Reader aufrufen müssen. –

+0

Diese Variablen werden mit dem Programm selbst erstellt. Es gibt keine Benutzerinteraktion. –

Antwort

1

Schema und Daten geladen:

create table Afspraak 
(
    id int auto_increment primary key, 
    afspraak_locatie varchar(100) not null, -- just an example (we don't know your datatype) 
    datum datetime not null -- you said it was a datetime in a comment under your question 
); 

insert Afspraak (afspraak_locatie,datum) values 
('Rome','2016-06-14 13:55:55'), 
('London','2016-06-15 15:12:12'), 
('Cairo','2016-06-16 07:00:33'), 
('Boston','2016-06-17 01:30:00'); 

select * from afspraak; 
+----+------------------+---------------------+ 
| id | afspraak_locatie | datum    | 
+----+------------------+---------------------+ 
| 1 | Rome    | 2016-06-14 13:55:55 | 
| 2 | London   | 2016-06-15 15:12:12 | 
| 3 | Cairo   | 2016-06-16 07:00:33 | 
| 4 | Boston   | 2016-06-17 01:30:00 | 
+----+------------------+---------------------+ 

GUI Schicht:

private void button1_Click(object sender, EventArgs e) 
{ 
    myDB.FindThatRow("2016-06-16"); // get data 
} 

DB Schicht:

public void FindThatRow(string theDate) 
{ // or all those rows 
    // 

    using (MySqlConnection lconn = new MySqlConnection(connString)) 
    { 
     lconn.Open(); 
     using (MySqlCommand cmd = new MySqlCommand()) 
     { // 
      cmd.Connection = lconn; 
      cmd.CommandText = @"select id,afspraak_locatie FROM Afspraak WHERE date(datum) = @pTheDate"; 
      cmd.Prepare(); 
      cmd.Parameters.AddWithValue("@pTheDate", theDate); 
      using (MySqlDataReader rs = cmd.ExecuteReader()) 
      { // 
       while (rs.Read()) 
       { 
        int qId = (int)rs.GetInt32("id"); 
        string sViewIt = rs.GetString("afspraak_locatie"); 
       } 
      } 
     } 
    } 
} 

es die Daten gefunden:

enter image description here

Verwenden Sie die using blocks wie von jedermann zu empfehlen. Binden Sie Ihre Parameter.


Die Gründe, warum man in Richtung Datenbindungen, im Vergleich zu String-Verkettung, wie in Ihrem Versuch steuern sollte, beinhalten die Funktionalität zu verlieren, was Angebote Bindung wie in Configuring Parameters and Parameter Data Types und anderen Verbindungen in der Nähe oder aus diesem Thema gesehen. Und es verwandelt die Abfrage in die Unordnung, die in PHP mit Verkettung gesehen wird, die ihre moderne Verwendung in Richtung Parameterdatenbindungen auch lenkte.

Stellen Sie sich vor, wie schwierig und Debug-intensive die folgende Abfrage ohne Bindungen würde:

enter image description here

SQL-Injection-Angriffe:

Parameterbindung schützt Sie vor solchen Angriffen, im Gegensatz zu Ihrem Methode der concat. Siehe die folgenden question einschließlich dieser answer für die Verwendung gespeicherter Prozeduren.

+0

Hallo, Great post. Ich könnte das Problem gefunden haben, ich öffne die Verbindung und dann benutze ich cmd1 und cmd2 für 2 verschiedene Abfragen, die erste funktioniert immer, aber die zweite immer scheitert anscheinend. Hast du eine Idee, warum das so wäre ??? Jemand schlug auch MySql gespeicherte Prozedur, möglicherweise, dass eine Lösung sein –

+0

Es wirft Fehler, wenn es eine Ergebnismenge Midstream und nicht abgeschlossen ist. Ich benutze Blöcke von Verbindungen (sehr kleine Blöcke), die eine segmentierte Verwendung haben. Oder, für einmalige Abfragen, wickle ich das connect, cmd, resultset in 'using' und fliehe die Routine, da ich das Verbindungsobjekt kenne und alles entsorgt wird. Also, habe verschiedene Verbindungsobjekte. Es bedeutet nicht, dass Sie auf dem Server keine Verbindungen mehr haben, wenn Sie es richtig machen. Es bedeutet, dass alle diese Fehler verschwinden. – Drew

+0

Ich habe derzeit 1 MySql-Verbindung, die ich über if (connection.open) öffne. Sollte ich für jede Abfrage in derselben Funktion/Methode eine neue anlegen oder sollte ich wie vorgeschlagen gespeicherte Prozeduren verwenden? –

Verwandte Themen