2016-03-22 11 views
9

ich versuche, eine Zeile aus der Datenbank auf dem phpAdmin Löschen der Abfrage funktioniert prima, aber wenn ich ausführen es mit demMySqlException auf ExecuteReader von UserID Auswahl (PK)

Code:

MySqlCommand getUserID = new MySqlCommand("SELECT UserID FROM User", connection); 

MySqlDataReader reader = getUserID.ExecuteReader(); 

ich erhalte die

Fehler:

Destination array is not long enough to copy all the items in the collection. Check array index and length.

I Fügen Sie den zu löschenden Benutzer vorher ohne Probleme ein.

Die Datenbank hat ein UserID mit Eigenschaften Unique, Int (Länge 9) und Auto-Increment und ein UserName von Typ Char.

Meine Frage ist:

Warum kann ich nicht erhalten die userID und wie kann ich es bekommen?

bearbeiten

ich nicht nur varchar eine ganze Zahl oder Datumsdaten empfangen können. Hier

ist die Erstellung der Datenbank-Abfrage: Creation Query

+0

Wie groß ist Ihre Daten? Wie viele Benutzer gibt es in der Tabelle? – Ian

+0

Es ist eine kleine Tabelle mit 20 Wert – SeeuD1

+1

"non query" für eine Auswahl? 'ERNST? Sie wissen, dass "SELECT" eine Abfrage pro Definition ist? ExecuteNonQuery ist für Dinge gedacht, die keine Daten zurückgeben (wie UPDATE, DELETE). – TomTom

Antwort

3

Das Problem ist die Datenbank MySqlConnection kann nicht Int oder Datumswerte erhalten, wenn sie nicht ohne Vorzeichen sind, das heißt, auch die Ausnahme:

"Destination array is not long enough to copy all the items in the collection. Check array index and length."

4

Die Ausnahme bedeutet, dass Sie ein unerwartetes Ergebnis bekommen. Die Methode ExecuteNonQuery versucht, eine Abfrage auszuführen, die keine Zeilen zurückgibt, und gibt eine Ganzzahl zurück, die die Anzahl der in der Datenbank bearbeiteten Zeilen anzeigt. Es versucht also, das Array von Ergebnissen in ein ganzzahliges Feld zu schreiben, was nicht möglich ist.

Um Ihre Frage zu beantworten, ist die Ursache des Fehlers die Abfrage. Für ausgewählte Abfragen sollten Sie die Methode ExecuteReader() verwenden.

4

Zum einen da Sie einen einzelnen Wert (UserID) abrufen möchten können Sie ExecuteScalar hier verwenden:

MySqlCommand getUserID = new MySqlCommand("SELECT UserID FROM `User`", connection); 
connection.Open(); 
int userId = (int)getUserID.ExecuteScalar(); 
connection.Close(); 

ZweitensUser ein reserved keyword ist, so dass Sie Backticks um Tabellennamen verwenden müssen um es explizit zu machen:

MySqlCommand getUserID = new MySqlCommand("SELECT UserID FROM `User`", connection);