Mysql IndexOutofRange bei 17 Eintrag

CrimeOne

Mitglied
Guten Abend Forummitglieder
Ich programmiere mit .Net c++, und habe dort zwegs Datenbank eine MySql Datenbankschnittstelle eingebaut...

Erstmal bisschen Input :D:
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:
                                //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 :D
 

CPoly

Mitglied Weizenbier
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

Mitglied
mmmm.... habs nochmal nachgekuggt, die Felder ID,Name, GUID, Level und IP sind arrays welche auch mit 16 initialisiert werden...
Code:
                        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:rolleyes:
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?
 
Zuletzt bearbeitet:

sheel

I love Asm
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ß
 

CrimeOne

Mitglied
was meinst du mit "unbekannter größe"?

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

aber unbekannt kann ja auch so aussehen:

Code:
                        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....
 

Steiner_B

Erfahrenes Mitglied
Alternativ kannst du natürlich auch auf die .net Datenstrukturen zurückgreifen und zum Beispiel eine ArrayList verwenden.
 

CrimeOne

Mitglied
So bin grade im MySql Referenzhandbuch über die funktion COUNT gestoßen...
Das ganze sieht jetzt so aus (gekürzt):

Code:
	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 :D... vorallem CPoly, der mich auf die initialisierung der Arrays als fehlerquelle gebracht hat...thx
 

sheel

I love Asm
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ß
 

CrimeOne

Mitglied
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...
 

sheel

I love Asm
Stimmt, bei der Größenordnung ist es wirklich egal.

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

Immerhin funktionierts jetzt.

Gruß