2012-04-08 17 views
3

Stellen Sie sich vor, wir haben zwei Tabellen in der Datenbank, user (FK id_role) und role (PK-Rolle). Wir müssen Informationen über Benutzer und seine Privilegien lesen.Abrufen von Werten aus verbundenen Tabellen mit SqlDataReader

Ich verwende die folgende SQL-Anweisung Abfrage auszuführen:

SELECT * 
FROM [user] 
INNER JOIN role ON [user].id_role = role.id 
WHERE login = @login 

Nach der Ausführung, versuche ich Werte in Leser Indexer mit Zeichenfolge zu lesen: reader[string name].

Das Problem, das ich lösen müssen, ist Namen zu wiederholen: beide user und role enthalten, zum Beispiel das Feld id, die ich in der Lage bin für Benutzer zu lesen (mit reader["id"]), aber nicht in der Lage für Rolle zu lesen (mit reader["role.id"]).

Die Eigenschaft FieldCount 12 zurückkehrt, was bedeutet, dass alle erforderlichen Felder gelesen wurden (user enthält 6 Felder, so auch role).

Kann ich Spalten in diesem Fall namentlich lesen? Oder mit zwei Abfragen oder SQL 'als' Operator auf die einzige Art und Weise?

+3

Sie müssen Spalte Aliase in Ihrer 'SELECT' definieren - oder Ordnungsposition lesen (' Reader [index]) ' - aber das ist natürlich anfällig für andere Probleme (wie 'Benutzer' Tabelle bekommt eine weitere Eigenschaft und dann sind Ihre Bestellungen alle um 1) - und diese könnten gelöst werden, indem Sie nicht 'SELECT *' - aber explizit alle Spalten auflisten Sie brauchen wirklich und wollen aus diesen beiden Tabellen wählen ... –

+1

Natürlich ist das Lesen nach Position unbequem ein wenig ... Wahrscheinlich ist Aliase die Antwort. Aber ich bin verwirrt, warum Datenreader vor Spalten keinen Tabellennamen hinzufügt. – Eadel

Antwort

10

Sie immer die Spalten explizit und Alias ​​sie wählen könnten:

SELECT user.id AS user_id, user.*, role.id AS role_id, role.* 
FROM [user] 
INNER JOIN role ON [user].id_role = role.id 
WHERE login = @login 

sie Dann wählen Sie mit reader["user_id"] und reader["role_id"].

+0

Nur eine Kuriosität zu wissen: zeigt es User_id Spalte zweimal? und dasselbe für die Spalte role_id? Vielen Dank. – sarwar026

+0

@ sarwar026, yeah, in dem, was ich dort geschrieben habe, würden beide ID-Spalten zweimal ausgewählt werden. – McGarnagle

+0

Es ist ein schöner Weg und wahrscheinlich der einfachste, danke! Ich denke, der beste Weg, solche Probleme zu vermeiden, besteht darin, Tabellenspalten mit eindeutigen Namen zu versehen. – Eadel

1

Der einzige robuste Weg ist, AS in der SQL-Abfrage zu verwenden, um sicherzustellen, dass Ihre Spaltennamen/Aliase eindeutig sind ... andernfalls würden Sie die Felder nach Index (0/1/2 usw.) anstatt namentlich.

1
SELECT role.id as RoleId, user.id as UserId 
FROM [user] 
INNER JOIN role ON [user].id_role = role.id 
WHERE login = @login 

Mit AS

reader["RoleId"]; 
1

Natürlich können Sie Spalten mit Namen auswählen sollten, aber Sie müssen es gerne tun:

SELECT u.id as uid, r.id as rid, ... , FROM [user] u INNER JOIN role r ON [user].id_role = role.id WHERE login = @login 

Mit , ..., I möchte die verbleibende Spalte der beiden Tabellen auswählen.

Schließlich Verwendung Leser [ "uid"], Leser [ "loswerden"] usw.

Verwandte Themen