Einfache Datenbankabfrage (neuling)

mfernau

Mitglied
Hallo!

In Sachen .NET (speziell C#) bin ich noch sehr unbeholfen und versuche mich gerade an einer simplen Datenbankabfrage. Ich benutze dabei die Express-Variante von VisualStudio mit C# und einer mysql Datanbank. Die Verbindung zur Datenbank klappt und eine einfache Select-Anweisung habe ich schon erfolgreich ausgeführt. Ich hab nur ein Problem bei einem Join von mehreren Tabellen wenn die Spaltennamen nicht mehr eindeutig sind. Folgendes Beispiel:

Ich habe zwei ganz einfache Tabellen erstellt:
test1(id, str) und test2(id, str)
Primärschlüssel ist die id-Spalte. Ich habe in beiden Tabellen nur einen einzigen Eintrag.
1, tabelle1 (für test1)
1, tabelle2 (für test2)

wenn ich also einen Join von den beiden Tabellen mache:
select * from test1 a, test2 b where a.id=b.id

dann bekomme ich folgendes Ergebnis:
1 | tabelle1 | 1 | tabelle2

folgendes einfaches c# Schnippsel dazu:

Code:
            myCommand = new MySqlCommand();
            myAdapter = new MySqlDataAdapter();
            myData = new DataTable();
            myCommand.Connection = MyContext.Connection;
            myCommand.CommandText = "select * from test1 a, test2 b where a.id=b.id";

            myAdapter.SelectCommand = myCommand;
            myAdapter.Fill( myData );
            MessageBox.Show( ""+myData.Rows[0]["str"] ); // liefert tabelle1
            MessageBox.Show( ""+myData.Rows[0]["b.str"] ); // wirft eine exception dass es den column nicht gibt

Wie kann ich denn auf diese Weise einen Column eindeutig spezifizieren? "str" ist in diesem Fall ja nicht mehr eindeutig und b.str kann ich nicht verwenden (wirft eine Ausnahme). Es muss doch aber eine Möglichkeit geben, einen Column unter Angabe des Tabellennamens anzusprechen?

Gruß,
Martin
 
Hallo,

nur mal zum Verständnis, was genau willst du auslesen? Da dein DataTable mit dem Result von deinem Query gefüllt wird, kann es deine Tabelle nicht mehr kennen. Wenn du jetzt genauer sagst was du vorhast, können wir dir dann auch sagen wie du es "besser/anders" löst.
 
Hallo!

Ich versuch mal zu erklären, was ich eigentlich vorhabe.
Ich habe halt ein paar Tabellen in einer DB. Der einfachheithalber sagen wir mal dass es ein Warenwirtschaftssystem ist (ist es auch in etwa). Also mit Artikeln, Lagerorten, Rechnungen usw..
Jetzt möchte ich beispielsweise ein Select-Statement schreiben, bei dem ich alle Artikel mit ihren Lagerorten bekomme. Damit ich damit später in meinem Programm besser arbeiten kann, möchte ich eine Objekt-Repräsentation meiner Artikel haben. Beispielsweise eine Klasse "Artikel" die dann eigentlich genauso ausschaut wie in der Datenbank. Damit das befüllen des Objektes mit den Datenbankdaten am Besten noch automatisch geht, würde ich der Klasse "Artikel" eine statische Factory-Methode spendieren, die mir eine Instanz dieses Objekts erzeugt und dabei eine Referenz eines DataRow-Objektes erwartet. Mit Hilfe dieser Referenz und den passenden Column-Namen könnte ich auf eine programmatische Art das Objekt mit den Daten füllen. Auf diese Weise könnte ich diese Factory-Methode meines Artikels bei jeder Datenbankabfrage benutzen wo ein Artikel drin steckt ohne jedes mal manuell die Daten in das Objekt übernehmen zu müssen (beispielsweise mit x Setter-Methodenaufrufen). Damit das Ganze aber möglichst in jeder erdenklichen Abfrage funktioniert, müsste ich sicherstellen dass die Spaltennamen auch wirklich eindeutig identifiziert werden (bei Joins über mehrere Tabellen ist das ja nicht mehr ohne Weiteres gewährleistet). In SQL macht man das indem man den Tabellennamen als Namespace davor schreibt. Aber wie bekomme ich das hier auf die Reihe?

Dasselbe Programm habe ich bereits in Java implementiert und verusche es gerade (zu Übungszewcken) auf .NET zu portieren. In Java geht das übrigens mit dieser Schreibweise. Also `tabelle`.`spalte` ist dort möglich.

Ich hoffe die Erklärung ist eingermaßen verständlich...

Gruß
 

Neue Beiträge

Zurück