使用SqlDataReader从连接的表中获取值

4
假设我们的数据库中有两个表,user(外键 id_role)和 role(主键 role)。我们需要读取关于用户及其权限的信息。
我使用以下SQL语句执行查询:
SELECT * 
FROM [user] 
INNER JOIN role ON [user].id_role = role.id 
WHERE login = @login

执行后,我尝试使用字符串索引器reader[string name]读取阅读器中的值。
我需要解决的问题是重复的名称:例如,userrole都包含字段id,我能够读取用户的id(使用reader["id"]),但无法读取角色的id(使用reader["role.id"])。
属性FieldCount返回12,这意味着已读取所有必需的字段(user包含6个字段,role也是如此)。
在这种情况下,我是否有可能按名称读取列?还是使用两个查询或SQL的'as'运算符是唯一的方法?

4
在你的SELECT语句中,需要定义列别名或按序号位置读取(Reader[index]),但这当然容易出现其他问题(比如User表增加了一个属性,那么你所有的订单都会偏移1) - 这些问题可以通过不使用SELECT *而明确列出你真正需要和想要从这两个表中选择的所有列来解决... - marc_s
1
当然,按位置读取有点不舒服...可能别名是答案。但我困惑的是为什么Datareader在列名前面不添加表名。 - Eadel
4个回答

12

您可以始终明确选择列并为其设置别名:

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"] 选取它们。


只是个好奇:它是否显示了user_id列两次?role_id列也是吗?谢谢。 - sarwar026
@sarwar026,是的,在我写的内容中,两个ID列都会被选择两次。 - McGarnagle
这是一种不错的方式,可能也是最简单的方式,谢谢!我想避免这样的问题的最佳方法是为表的列提供唯一的名称。 - Eadel

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"];

有没有不使用 AS 的解决方案? - zwcloud

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"] 等等。


1
唯一的可靠方法是在 SQL 查询中使用 AS 来确保列名/别名唯一性 …… 否则你只能通过索引(0 / 1 / 2 等)而非名称来访问字段。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接