3 Stimmen

Wie liest man das Ergebnis von SELECT * aus verbundenen Tabellen mit doppelten Spaltennamen in .NET

Ich bin ein PHP/MySQL-Entwickler, der sich langsam in das Reich von C#/SQL Server vorwagt, und ich habe ein Problem in C#, wenn es darum geht, eine SQL Server-Abfrage zu lesen, die zwei Tabellen miteinander verbindet.

Gegeben sind die beiden Tabellen:

TabelleA:

int:id
VARCHAR(50):name
int:b_id

TabelleB:

int:id
VARCHAR(50):name

Und angesichts der Abfrage

SELECT * FROM TableA,TableB WHERE TableA.b_id = TableB.id;

In C# lese ich Abfragedaten normalerweise auf folgende Weise:

SqlDataReader data_reader= sql_command.ExecuteReader();
data_reader["Field"];

Nur in diesem Fall muss ich zwischen der Namensspalte von TabelleA und der Namensspalte von TabelleB unterscheiden.

In PHP würde ich einfach nach dem Feld "TabelleA.Name" oder "TabelleB.Name" fragen, aber wenn ich etwas wie

data_reader["TableB.name"];

in C#, mein Code ist fehlerhaft.

Wie lässt sich das beheben? Und wie kann ich eine Abfrage auf mehrere Tabellen in C# lesen?

0 Stimmen

5voto

CodeRedick Punkte 7212

Die Ergebnismenge sieht nur die zurückgegebenen Daten/Spaltennamen, nicht die zugrunde liegende Tabelle. Ändern Sie Ihre Abfrage in etwas wie

SELECT TableA.Name as Name_TA, TableB.Name as Name_TB from ...

Dann können Sie sich auf die Felder wie folgt beziehen:

data_reader["Name_TA"];

1 Stimmen

Danke, Andrew. Das ist eine Lösung, aber ich bin kein Fan davon, weil ich vor der Abfrage jeden widersprüchlichen Feldnamen kennen und den Schalter in meiner Abfrage angeben muss. Gibt es eine Möglichkeit, eine Funktion auszuführen, die alle TableA-Werte mit dem Suffix _TA oder etwas Ähnlichem umbenennt?

0 Stimmen

Alles, was Sie tun könnten, um die Ergebnisspalten "automatisch" umzubenennen, würde voraussetzen, dass Sie den Namen irgendwo angeben. Sie könnten eine Ansicht oder eine gespeicherte Prozedur erstellen, vielleicht, wenn Sie wirklich gut sind, etwas dynamisches SQL erstellen... aber irgendwann werden Sie table.field AS newName machen, um zu disambiguieren.

0 Stimmen

Im Allgemeinen sollten Sie "SELECT *" vermeiden und die Feldnamen ausdrücklich angeben. Dieses Problem ist nur einer der Gründe dafür.

3voto

user995670 Punkte 31

Denjenigen, die schreiben, dass es falsch ist, "SELECT *" zu verwenden, kann ich nicht zustimmen. Es gibt viele Fälle in der realen Welt, in denen ein SELECT * notwendig ist. Ihre absoluten Aussagen über die "falsche" Verwendung können jemanden von einer legitimen Lösung abbringen.

Das Problem liegt hier nicht in der Verwendung von SELECT *, sondern in einer Einschränkung in ADO.NET .

Wie im OP erwähnt, können Sie in PHP eine Datenzeile mit der Syntax "TABLE.COLUMN" indizieren, so wie auch Raw SQL mit Konflikten zwischen Spaltennamen umgeht:

SELECT table1.ID, table2.ID FROM table1, table;

Warum DataReader nicht auf diese Weise implementiert ist, weiß ich nicht...

Allerdings könnte eine Lösung verwendet werden, um Ihre SQL-Anweisung dynamisch zu erstellen, indem:

  • Abfrage des Schemas der Tabellen, aus denen Sie auswählen
  • erstellen Sie Ihre SELECT-Klausel, indem Sie die Spaltennamen im Schema durchgehen

Auf diese Weise können Sie eine Abfrage wie die folgende erstellen, ohne dass Sie wissen müssen, welche Spalten derzeit im Schema für die Tabellen, aus denen Sie auswählen, vorhanden sind

SELECT TabelleA.Name as Name_TA, TabelleB.Name as Name_TB from ...

1voto

uncleO Punkte 8135

Sie könnten versuchen, die Werte nach Index (einer Zahl) statt nach Schlüssel zu lesen.

name = data_reader[4];

Sie müssen experimentieren, um zu sehen, wie die Zahlen übereinstimmen.

0voto

John Saunders Punkte 159011

Willkommen in der realen Welt. In der realen Welt verwenden wir nicht "SELECT *". Geben Sie an, welche Spalten Sie aus welchen Tabellen und ggf. mit welchem Alias abfragen wollen.

0voto

Tech AG Punkte 56

Obwohl es besser ist, eine Spaltenliste zu verwenden, um doppelte Spalten zu entfernen, wenn Sie aus irgendeinem Grund ***** wollen, dann verwenden Sie einfach

rdr.item("duplicate_column_name")

Dies gibt den Wert der ersten Spalte zurück, da die innere Verknüpfung in beiden identischen Spalten die gleichen Werte hat.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X