tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von CPoly
ERLEDIGT
NEIN
ANTWORTEN
9
ZUGRIFFE
664
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    CrimeOne CrimeOne ist offline Mitglied Bronze
    Registriert seit
    Jun 2008
    Beiträge
    37
    Guten Abend Forummitglieder
    Ich programmiere mit .Net c++, und habe dort zwegs Datenbank eine MySql Datenbankschnittstelle eingebaut...

    Erstmal bisschen Input :
    Also, ich habe einen UDP Server, welcher 24 Stunden am tag auf Anfragen wartet, bei ihm aufm server is auch die MySql datenbank, die Benutzer verbinden sch mittels einem UDP Client. Ziel der ganzen geschichte ist es, das der Benutzer in der Datenbank mit seiner aktuellen IP gemeldet ist.

    Das ganze funktioniert wunderbar, der UDP Server aktualisiert mittels dem Update Befehl die Zeilen der Benutzer, und legt auch neue an, wenn sich neue Benutzer im System einklinken.

    Das ganze macht er voll automatisch bis zum 17 Eintrag, wenn sich dann ein Benutzer in der Datenbank anmelden will, bekommt der UDP Server eine System.Index.Out.of.range.Exception, hier mal der betroffene Codeschnipsel:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
                                    //Daten aus Datenbank abfragen
                    befehl = verbindung->CreateCommand();
                    befehl->CommandText = "SELECT * FROM MSS_Users";
                    leser = befehl->ExecuteReader();
                    int aktDatensatz;
                    //Daten in Arrays kopieren
                    aktDatensatz = -1;
                    while (leser->Read())
                    {
                        aktDatensatz++;
                        ID[aktDatensatz] = leser->GetInt32(0);
                        Name[aktDatensatz] = leser->GetString(1);
                        GUID[aktDatensatz] = leser->GetInt32(2);
                        Level[aktDatensatz] = leser->GetInt32(3);
                        IP[aktDatensatz] = leser->GetString(4);
                        
                    }
    Die Index Out of Range Exception bezieht sich auf die Zeile: IP[aktDatensatz] = leser->GetString(4);

    Und zwar erst beim auslesen der 17 Zeile, alle davor liest er ohne probleme aus...

    Ich hab ehrlich gesagt keine Ahnung warum das so ist, hoffe allerdings das hier irgendwer dieses Phänomen kennt und eine Lösung parat hat
     

  2. #2
    CPoly CPoly ist offline Mitglied Weizenbier
    tutorials.de Premium-User
    Registriert seit
    Sep 2009
    Beiträge
    2.445
    Sehe ich das richtig, dass es sich bei ID, Name, GUID, Level und IP um Arrays handelt oder ist es ein anderer Datentyp? Wenn es Arrays sind, mit welcher größe initialisierst du diese, wenn du nicht wissen kannst, wie viele Einträge die Datenbank liefert? Eventuell hast du IP nur mit 16 initialisiert?
    CrimeOne bedankt sich. 

  3. #3
    CrimeOne CrimeOne ist offline Mitglied Bronze
    Registriert seit
    Jun 2008
    Beiträge
    37
    mmmm.... habs nochmal nachgekuggt, die Felder ID,Name, GUID, Level und IP sind arrays welche auch mit 16 initialisiert werden...
    Code :
    1
    2
    3
    4
    5
    
                            ID = gcnew array<int>(16);
                Name = gcnew array<String^>(16);
                GUID = gcnew array<int>(16);
                Level = gcnew array<int>(16);
                IP = gcnew array<String^>(16);

    Da hätte ich echt selbst drauf kommen können
    ich mein ich hab die Arraygrenze auf 20 erstmal angehoben, damit das System erstmal weiterlaufen kann...
    Wie kann ich denn jetzt das Limit aufheben? weil ein Array ohne diese "limitierung" funktioniert ja nicht... da die Datenbank aber stetig wächst, müsste ich ja mittels MySql den "größten" Zeilenwert in der tabelle auslesen, also praktisch das ich wenn meine Tabelle beispielsweiße 30 Zeilen lang is, ich nen integer wert mit Inhalt 30 bekomme? dann könnte ich die Arraygrenze variabel machen... wie würde dass den gehn?
    Geändert von CrimeOne (08.07.11 um 02:21 Uhr)
     

  4. #4
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.504
    Hi

    ein Array mit unbekannter Größe anlegen geht nicht.
    Bei einer Db-Con im Voraus die Zeilenanzahl abfragen ist auch nicht vorgesehen (außer mit einer count-Abfrage).

    Lösung:
    -entweder bei Überschreiten der Grenze ein größeres Array (zB immer 1 mehr, oder in Zehnerschritten, oder....) anlegen
    und die Werte aus dem alten hineinkopieren.
    -oder eine andere Datenstruktur (zB verkettete Listen) verwenden.

    Gruß
     

  5. #5
    CrimeOne CrimeOne ist offline Mitglied Bronze
    Registriert seit
    Jun 2008
    Beiträge
    37
    was meinst du mit "unbekannter größe"?

    Code :
    1
    
    ID = gcnew array<int>(); ->Das dass nicht geht ist klar....

    aber unbekannt kann ja auch so aussehen:

    Code :
    1
    2
    
                            int test = 20;
                ID = gcnew array<int>(test);

    Und dass funktioniert ja.... ich bräuchte nur noch eine Funktion aus MySql mit der ich die Zeilenanzahl der Tabelle herausfinde, um sie dann der variable test zuzuweisen....
     

  6. #6
    Steiner_B Steiner_B ist offline Mitglied Platin
    Registriert seit
    Mar 2004
    Ort
    Wien
    Beiträge
    573
    Alternativ kannst du natürlich auch auf die .net Datenstrukturen zurückgreifen und zum Beispiel eine ArrayList verwenden.
     

  7. #7
    CrimeOne CrimeOne ist offline Mitglied Bronze
    Registriert seit
    Jun 2008
    Beiträge
    37
    So bin grade im MySql Referenzhandbuch über die funktion COUNT gestoßen...
    Das ganze sieht jetzt so aus (gekürzt):

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
        int MaxCounter;
                    //Daten aus Datenbank abfragen
                    befehl = verbindung->CreateCommand();
                    befehl->CommandText = "SELECT COUNT(*) FROM MSS_Users";
                    leser = befehl->ExecuteReader();
                    while(leser->Read())
                    {
                        aktDatensatz++;
                        MaxCounter = leser->GetInt32(0);
                    }
     
    //Später:
                ID = gcnew array<int>(MaxCounter);
                Name = gcnew array<String^>(MaxCounter);
                GUID = gcnew array<int>(MaxCounter);
                Level = gcnew array<int>(MaxCounter);
                IP = gcnew array<String^>(MaxCounter);

    Damit funktioniert es, das Array passt sich jedesmal der Datenbanktabelle an... Danke euch allen für eure Mühen ... vorallem CPoly, der mich auf die initialisierung der Arrays als fehlerquelle gebracht hat...thx
     

  8. #8
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.504
    Nochmal zur Klarstellung: Statt "unbekannter Größe" hätte ich wohl besser
    "nicht angegebene Groöe" schreiben sollen.

    Und das mit dem SQL-count hab ich doch oben schon geschrieben...
    aber bei vielen Datensätzen geht das auf die Geschwindigkeit.

    Gruß
     

  9. #9
    CrimeOne CrimeOne ist offline Mitglied Bronze
    Registriert seit
    Jun 2008
    Beiträge
    37
    mmm..... Das mit Count hab ich wohl überlesen....
    Die Geschwindigkeit ist aber erstmal zu vernachlässigen (es werden so rund 30 Datensätze letztendlich werden)...., da die Datenbank wirklich nur als Anmeldesystem fungiert, gearbeitet wird dann in einem anderen programm...desweiteren ist die Anmeldung sowieso um 900ms verzögert, um zu gewährleisten dass die Daten komplett bearbeitet wurden....von daher passt das ganze so...
     

  10. #10
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.504
    Stimmt, bei der Größenordnung ist es wirklich egal.

    Bei 30000 würds anders ausschauen, aber so...

    Immerhin funktionierts jetzt.

    Gruß
     

Ähnliche Themen

  1. Fehler bei MySQL-Eintrag
    Von Lil-rich im Forum PHP
    Antworten: 19
    Letzter Beitrag: 13.06.06, 14:55
  2. Probleme mit Eintrag in MySQL-DB
    Von Ilona85 im Forum Visual Basic 6.0
    Antworten: 2
    Letzter Beitrag: 03.04.06, 21:48
  3. mysql eintrag löschen
    Von fUnKuCh3n im Forum PHP
    Antworten: 7
    Letzter Beitrag: 23.08.04, 17:50
  4. mysql doppelter eintrag!
    Von rengos im Forum PHP
    Antworten: 6
    Letzter Beitrag: 09.05.04, 20:57
  5. mysql eintrag
    Von z0oL im Forum PHP
    Antworten: 11
    Letzter Beitrag: 13.10.02, 17:29

Stichworte