使用SqlDataReader从连接表中获取值

时间:2012-04-08 18:41:27

标签: c# .net sql-server ado.net sqldatareader

想象一下,我们在数据库中有两个表,user(FK id_role)和role(PK角色)。我们需要阅读有关用户及其权限的信息。

我使用以下SQL语句来执行查询:

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

执行后,我尝试使用字符串索引器读取读取器中的值:reader[string name]

我需要解决的问题是重复名称:userrole都包含,例如,字段id,我能够为用户阅读(使用{{ 1}}),但无法读取角色(使用reader["id"])。

属性reader["role.id"]返回12,表示已读取所有必填字段(FieldCount包含6个字段,user也是如此。

在这种情况下,我是否有可能按名称读取列?或者以唯一的方式使用两个查询或SQL'作为'运算符?

4 个答案:

答案 0 :(得分:11)

您可以始终明确选择列并将其别名:

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

然后使用reader["user_id"]reader["role_id"]选择它们。

答案 1 :(得分:1)

唯一可行的方法是在SQL查询中使用AS以确保列名称/别名是唯一的...否则您将按索引(0/1/2等)访问字段。而不是名字。

答案 2 :(得分:1)

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

使用AS

reader["RoleId"];

答案 3 :(得分:1)

当然,您应该按名称选择列,但您需要这样做:

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

使用,...,我想选择两个表的剩余列。

最后,使用reader [“uid”],reader [“rid”]等。