3

假设我们在数据库中有两个表,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]

我需要解决的问题是重复名称:两者都user包含role,例如,字段id,我可以为用户读取(使用reader["id"]),但无法读取角色(使用reader["role.id"])。

该属性FieldCount返回 12,这意味着已读取所有必填字段(user包含 6 个字段,也是如此role)。

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

4

4 回答 4

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

于 2012-04-08T18:47:57.523 回答
1

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

于 2012-04-08T18:48:24.747 回答
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"];
于 2012-04-08T18:48:37.110 回答
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"] 等。

于 2012-04-08T18:49:13.990 回答