Laden...

SQL-Abfrage liefert nur einen Datensatz

Erstellt von Buzz Tyca vor 7 Jahren Letzter Beitrag vor 7 Jahren 2.437 Views
B
Buzz Tyca Themenstarter:in
50 Beiträge seit 2015
vor 7 Jahren
SQL-Abfrage liefert nur einen Datensatz

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

W
872 Beiträge seit 2005
vor 7 Jahren

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;
}

B
Buzz Tyca Themenstarter:in
50 Beiträge seit 2015
vor 7 Jahren

Was meinst du mit "doppelt"?

edit:

reader.RecordCount wird bei mir sofort als Fehler angezeigt. Brauche ich dafür ein Using?

2.207 Beiträge seit 2011
vor 7 Jahren

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

B
Buzz Tyca Themenstarter:in
50 Beiträge seit 2015
vor 7 Jahren

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.

849 Beiträge seit 2006
vor 7 Jahren

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ß

B
Buzz Tyca Themenstarter:in
50 Beiträge seit 2015
vor 7 Jahren

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.

2.207 Beiträge seit 2011
vor 7 Jahren

Hallo Buzz Tyca,

Für Verbesserungsvorschläge bin ich aber dankbar.

Steht alles hier im Thread. Benutze usings und nimm ne Liste 😃

Gruss

Coffeebean

B
Buzz Tyca Themenstarter:in
50 Beiträge seit 2015
vor 7 Jahren

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

3.003 Beiträge seit 2006
vor 7 Jahren

"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)

5.299 Beiträge seit 2008
vor 7 Jahren

@TE:
3 Punkte:

  1. Probierma so:

      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.


  1. Sehr fragwürdig erscheint mir das Datenmodell: Weder LicNo noch active sollten als String modelliert sein, sondern die Benamung legt nahe, dass LicNo int sein sollte und active bool.
    Und beide Werte dann in einen string zusammenzustopfen ist nochmal ein Verbrechen.

Zumindest oberflächlich besehen scheint man die Datenbank neu machen zu müssen, und im Grunde auch alles was davon abhängig ist.


  1. Die Bedeutung von Schlüsselworten wie using sollte man entweder aus Referenz-mässigen Büchern erlernen, oder aus der Referenz selbst, also von MSDN.
    Letzteres ist sehr leicht anzunavigieren: Einfach im Code den Cursor auf das Schlüsselwort (using) setzen und F1 drücken - da kommt man hier heraus:
    https://msdn.microsoft.com/query/dev12.query?appId=Dev12IDEF1&l=EN-US&k=k%28using_CSharpKeyword%29;k%28TargetFrameworkMoniker-.NETFramework (zum Statement weiter-browsen)

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.