Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
SQL-Abfrage liefert nur einen Datensatz
Buzz Tyca
myCSharp.de - Member



Dabei seit:
Beiträge: 52

Themenstarter:

SQL-Abfrage liefert nur einen Datensatz

beantworten | zitieren | melden

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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Buzz Tyca am .
private Nachricht | Beiträge des Benutzers
weismat
myCSharp.de - Member



Dabei seit:
Beiträge: 878
Herkunft: Frankfurt am Main

beantworten | zitieren | melden

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;
}
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von weismat am .
private Nachricht | Beiträge des Benutzers
Buzz Tyca
myCSharp.de - Member



Dabei seit:
Beiträge: 52

Themenstarter:

beantworten | zitieren | melden

Was meinst du mit "doppelt"?

edit:

reader.RecordCount wird bei mir sofort als Fehler angezeigt. Brauche ich dafür ein Using?
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Buzz Tyca am .
private Nachricht | Beiträge des Benutzers
Coffeebean
myCSharp.de - Team

Avatar #avatar-3295.gif


Dabei seit:
Beiträge: 2461
Herkunft: Deutschland/Schweiz

beantworten | zitieren | melden

Hallo Buzz Tyca,

btw: Schau dir mal usings an.
Zitat von Buzz Tyca
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
private Nachricht | Beiträge des Benutzers
Buzz Tyca
myCSharp.de - Member



Dabei seit:
Beiträge: 52

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
unconnected
myCSharp.de - Member

Avatar #avatar-3200.jpg


Dabei seit:
Beiträge: 862
Herkunft: Oerlinghausen/NRW

beantworten | zitieren | melden

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ß
private Nachricht | Beiträge des Benutzers
Buzz Tyca
myCSharp.de - Member



Dabei seit:
Beiträge: 52

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Coffeebean
myCSharp.de - Team

Avatar #avatar-3295.gif


Dabei seit:
Beiträge: 2461
Herkunft: Deutschland/Schweiz

beantworten | zitieren | melden

Hallo Buzz Tyca,
Zitat von Buzz Tyca
Für Verbesserungsvorschläge bin ich aber dankbar.

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

Gruss

Coffeebean
private Nachricht | Beiträge des Benutzers
Buzz Tyca
myCSharp.de - Member



Dabei seit:
Beiträge: 52

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
LaTino
myCSharp.de - Experte

Avatar #avatar-4122.png


Dabei seit:
Beiträge: 3062
Herkunft: Thüringen

beantworten | zitieren | melden

...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)
private Nachricht | Beiträge des Benutzers
ErfinderDesRades
myCSharp.de - Experte

Avatar #avatar-3151.jpg


Dabei seit:
Beiträge: 5409

beantworten | zitieren | melden

@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.
___________________

2) 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.
__________________

3) 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.
Dieser Beitrag wurde 4 mal editiert, zum letzten Mal von ErfinderDesRades am .
Der frühe Apfel fängt den Wurm.
private Nachricht | Beiträge des Benutzers