Autor Beitrag
Eydamos
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Do 15.10.09 00:18 
Erstmal zu meiner Grundidee wieso ich das vorhabe, was ich machen will. Ich mache mir gerade eine Klasse die Daten aus einer MySQL Tabelle auslesen soll. Dafür habe ich dann die Methode select(string query) die die abfrage durchführt und dann true oder false zurückgibt. Nun möchte ich gerne eine Methode schreiben die ich fetchArray nenne und die mir ein Array zurückgibt in dem sich Hashtables befinden die als Key den Spaltennamen haben und als value halt den Wert. In jedem abschnitt des Arrays (also back[0], back[1] etc.) soll dann ein Datensatz drin stehen, daher das Array. Die Methode liefert dann das Array zurück, damit ich dieses dann mit einer foreach schleife auslesen kann änhlich wie ich es bei php mache.

Der Programm ablauf soll also etwa so aussehen:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
MysqlHandler mysql = new MysqlHandler();
mysql.connect("localhost""root""passwort""meinedatenbank");
mysql.select("SELECT * from news");
foreach(Hashtable row in mysql.fetchArray())
{
  Console.WriteLine("id: "+row["id"]+"news:"+row["news"]);
}


Jetzt zu meinem eigentlichen Problem. Wenn ich die Daten in einer Hashtable lade und dieses dann dem Array zuweise und dann den nächsten Datensatz dem array zuweise, dann sind in beiden Abschnitten des Arrays die selben Werte.

Ein Beispiel wird sicher deutlicher machen was ich meine:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
Hashtable rowData = new Hashtable();
Hashtable[] back = new Hashtable[3];

rowData.Add("id""1");
rowData.Add("day""2009-01-01");
back[0] = rowData;
Console.WriteLine("id: "+back[0]["id"]+" day: "+back[0]["day"]);
rowData.Clear();
rowData.Add("id""2");
rowData.Add("day""2009-02-02");
back[1] = rowData;
rowData.Clear();
rowData.Add("id""3");
rowData.Add("day""2009-03-03");
back[2] = rowData;

foreach (Hashtable row in back)
{
  Console.WriteLine("id: "+row["id"]+" day: "+row["day"]);
}
Console.ReadKey();


Ausgabe:
ausblenden C#-Quelltext
1:
2:
3:
4:
id: 1 day: 2009-01-01
id: 3 day: 2009-03-03
id: 3 day: 2009-03-03
id: 3 day: 2009-03-03


Wenn ich back[0] direkt ausgebe sind also die richtigen daten drin. Sobald ich aber rowData ändere ändern sich auch die bereits im array gespeicherten Daten. sollte das was in back[0] gespeichert ist nicht unabhängig sein von rowData? wenn ich eine variable i in back[0] speicher und i anschließend um 1 erhöhe ist in back[0] doch auch immernoch der alte wert gespeichert.

Ich bin ratlos.
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Do 15.10.09 09:10 
Hallo und :welcome:

Ich verstehe überhaupt nicht, was der Sinn deines Vorgehens ist. Wenn man Daten von einer Datenbank holt, ist es das einfachste, das als DataTable in Empfang zu nehmen und weiterzugeben. Warum das als HashTable und Array weiterbenutzt werden soll? :?:

Sofern du es dir richtig überlegt hast, solltest du vielleicht besser Dictionary<Key, Value> verwenden. Dann hast du deine Paare und bist flexibler als mit einem Array. (Aber das ist nur als Anregung zu sehen.)

Gruß Jürgen
Eydamos Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Do 15.10.09 11:48 
Ist ein Dictionary nicht so ziemlich das selbe wie eine Hashtable? Nur wird bei einer Hashtable der Key zu einem Hash gemacht und bei einem Dictionary nicht oder? Hab mir dictionarys nur einmal kurz angesehen aber die Beschreibungen die ich dazu gesehen habe waren alle recht kompliziert geschrieben.

Ich würde halt gerne auf die Werte zugreifen wie in PHP also den Namen der Spalte verwenden. row["id"] z.b. da C ja leider in Arrays nur Zahlen als Key annimmt habe ich dann statt dessen die Hashtable genommen als ich das erste mal davon gehört habe.

Das Array nutze ich um die einzelnen Datensätze zu speichern, da ja in einer Hashtable nicht zweimal der selbe Key vorkommen darf. Deswegen wollte ich in back[0] den ersten Datensatz speichern in back[1] den zweiten und so weiter. Das Array sollte dann von der Funktion zurückgegeben werden, damit ich es in einer foreach schleife datensatz für datensatz auswerten kann.

Ich werde mich mal auf jeden Fall noch einlesen in diese DataTable, vllt kann die ja schon das was ich will.
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Do 15.10.09 11:51 
user profile iconEydamos hat folgendes geschrieben Zum zitierten Posting springen:
Ich werde mich mal auf jeden Fall noch einlesen in diese DataTable, vllt kann die ja schon das was ich will.

Siehe OpenBook VC# Kap. 25 ff., speziell Kap. 28.

Jürgen
Eydamos Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Do 15.10.09 14:15 
Danke für die Hilfe, DataTable war das optimale Objekt dafür. Nun kann ich alles so nutzen wie ich wollte.