verwendetes Datenbanksystem: <mySql>
Hallo zusammen,
ich bin gerade dabei eine Datenbank auszulesen, und bin auf ein Problem gestoßen, dass ich so noch nie hatte. Wahrscheinlich ein typischer Anfängerfehler.
Die Tabelle die ich anspreche hat z.Z. um die 10 Datensätze, zurück geliefert wird aber nur einer.
Mein Code sieht folgendermaßen aus:
private string[] getDataFromPublic()
{
String conString = "SERVER=127.0.0.1;DATABASE=lss_software;UID=root;";
MySqlConnection con = new MySqlConnection(conString);
MySqlCommand com = con.CreateCommand();
com.CommandText = "select licenseKey, active from license";
MySqlDataReader reader;
con.Open();
reader = com.ExecuteReader();
string[] data = new string[reader.FieldCount];
int i = 0;
MessageBox.Show(Convert.ToString(reader.FieldCount));
while (reader.Read() && i < reader.FieldCount)
{
MessageBox.Show(reader.GetValue(i).ToString());
data[i] = reader.GetValue(i).ToString();
i++;
}
return data;
}
das Array das zurück kommt hat genau einen Lizenzschlüssel und einen Aktivitätsbit, obwohl ich alle erwarte.
Gebe ich die Abfrage in PHP-MyAdmin ein, erhalte ich das gewünschte Ergebnis.
Meine Überlegung ist nun, dass ich evtl das Array falsch fülle...
Andererseits ist der FieldCount auch nur bei 2.
Bin für jede Idee dankbar.
LG Buzz
Du verwechselst wahrscheinlich RecordCount mit FieldCount....
Aber an sich brauchst Du das gar nicht. Du machst das doppelt.
private string[] getDataFromPublic()
{
String conString = "SERVER=127.0.0.1;DATABASE=lss_software;UID=root;";
MySqlConnection con = new MySqlConnection(conString);
MySqlCommand com = con.CreateCommand();
com.CommandText = "select licenseKey, active from license";
MySqlDataReader reader;
con.Open();
reader = com.ExecuteReader();
string[] data = new string[reader.FieldCount];
int i = 0;
MessageBox.Show(Convert.ToString(reader.RecordCount ));
while (reader.Read())
{
MessageBox.Show(reader.GetValue(i).ToString());
data[i] = reader.GetValue(i).ToString();
i++;
}
return data;
}
Was meinst du mit "doppelt"?
edit:
reader.RecordCount wird bei mir sofort als Fehler angezeigt. Brauche ich dafür ein Using?
Hallo Buzz Tyca,
btw: Schau dir mal usings
an.
Was meinst du mit "doppelt"?
while (reader.Read() && i < reader.FieldCount)
Du brauchst das nicht mitzählen. Dafür ist ja die while-Schleife da...
Gruss
Coffeebean
Microsoft MVP // Me // Blog // GitHub // @Egghead // All my talks // Speakerdeck
Also warum der reader.RecordCount nicht funktioniert weiß ich inzwischen. siehe: https://support.microsoft.com/de-de/kb/308352
Wenn ich also den reader durchlaufen lasse, und mitzähle bekomme ich auch das richtige Ergebnis. Jetzt sollte ich also in der Lage sein, ein Array zusammen zu bauen.
Hallo,
benutz doch der einfachheit halber eine List<string> und kein Array. Dann musst Du vorher auch nicht wissen wieviele Datensätze Du hast.
var data = new List<string>();
while (reader.Read())
{
data.Add(reader.GetValue(0).toString());
}
Oder willst Du auch über die Spalten iterieren und nicht nur über die Zeilen? Dann bräuchtest Du auch 2 Schleifen.
Gruß
Ich habe es jetzt wie folgt gelößt:
String conString = "SERVER=127.0.0.1;DATABASE=lss_software;UID=root;";
MySqlConnection con = new MySqlConnection(conString);
MySqlCommand com = con.CreateCommand();
com.CommandText = "select LicNo, active from license";
MySqlDataReader reader;
con.Open();
reader = com.ExecuteReader();
string[] data = new string[0];
int j = 0;
while (reader.Read())
{
for (int i = 0; i < reader.FieldCount; i++)
{
//MessageBox.Show(reader.GetString(i) + i);
data = addLine(data, reader.GetString(i));
//addLine fügt dem Array ein weiteres Feld hinzu so dass ich es "dynamisch" habe.
j++;
}
}
return data;
Sa habe ich die Daten in einem Array und kann wunderbar damit weiter arbeiten.
Warum ich es nicht gleich so gemacht habe, weiß ich allerdings nicht. Ähnlich habe ich schon mehrfach DBs ausgelesen, wenn auch meist nur einen bestimmten Wert.
Für Verbesserungsvorschläge bin ich aber dankbar.
Hallo Buzz Tyca,
Für Verbesserungsvorschläge bin ich aber dankbar.
Steht alles hier im Thread. Benutze usings und nimm ne Liste 😃
Gruss
Coffeebean
Microsoft MVP // Me // Blog // GitHub // @Egghead // All my talks // Speakerdeck
Hab grade einen interessanten Artikel zu using gefunden. War mich überhaupt nicht klar, dass es das gibt.
Für Interessierte: http://www.codingfreaks.de/2009/01/28/c_using_idisposable_verstanden/
Danke für den Tipp
LG Buzz
...oder man guckt hier im Forum: [Artikel] Ressourcen schonen - Datenbanken richtig öffnen und schließen
LaTino
"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)
@TE:
3 Punkte:
public static List<string> GetData() {
String conString = "SERVER=127.0.0.1;DATABASE=lss_software;UID=root;";
using (var con = new MySqlConnection(conString)) using (var com = con.CreateCommand()) {
com.CommandText = "select LicNo, active from license";
con.Open();
using (var reader = com.ExecuteReader()) {
var data = new List<string>();
while (reader.Read()) {
data.Add(string.Join(", ", Enumerable.Range(0, reader.FieldCount).Select(reader.GetString)));
}
return data;
}
}
}
Die addLine() - Function habich durch string.Join() ersetzt - ich vermute, dein addLine macht auch nix anneres, nur komplizierter.
LicNo
noch active
sollten als String modelliert sein, sondern die Benamung legt nahe, dass LicNo int
sein sollte und active bool
.Zumindest oberflächlich besehen scheint man die Datenbank neu machen zu müssen, und im Grunde auch alles was davon abhängig ist.
using
sollte man entweder aus Referenz-mässigen Büchern erlernen, oder aus der Referenz selbst, also von MSDN.using
) setzen und F1 drücken - da kommt man hier heraus:Inet-Artikel mögen gut sein, v.a. zur Illustration - aber ob sie referenz-mäßige Vollständigkeit und Korrektheit aufweisen ist oft unsicher.
Hingegen ein gut Buch, oder MSDN selbst...
Bücher haben gegen MSDN noch den Vorzug, dass sie üblicherweise eine Linie entwickeln, sodass man zumindest einen (großen) Teil der vielfältig verflochtenen Zusammenhänge mitbekommt, und dass Verständnis-Vorraussetzungen erfüllt sind, wenn man vorherige Kapitel gelesen hat.
Der frühe Apfel fängt den Wurm.