【问题标题】:Get values from joined tables using SqlDataReader使用 SqlDataReader 从连接表中获取值
【发布时间】:2012-04-08 18:41:27
【问题描述】:

假设我们在数据库中有两个表,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 字段,我可以为用户读取(使用 reader["id"]),但不能阅读角色(使用reader["role.id"])。

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

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

【问题讨论】:

  • 您需要在 SELECT 中定义列别名 - 或按序号位置 (Reader[index]) 读取 - 但这当然容易出现其他问题(例如 User 表获得了另一个属性然后您的订单全部取消 1) - 这些可以通过不使用 SELECT * 来解决 - 但明确列出您真正需要并希望从这两个表中选择的所有列...
  • 当然,按位置阅读有点不舒服......可能别名就是答案。但我很困惑为什么 datareader 不在列之前添加表名。

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


【解决方案1】:

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

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,是的,在我在那里写的内容中,两个 ID 列都会被选中两次。
  • 这是一个不错的方法,可能也是最简单的方法,谢谢!我想避免此类问题的最佳方法是为表的列提供唯一名称。
【解决方案2】:

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

【讨论】:

    【解决方案3】:
    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"];
    

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-11-15
        • 1970-01-01
        • 1970-01-01
        • 2016-09-17
        • 1970-01-01
        • 2015-08-11
        • 2014-11-06
        相关资源
        最近更新 更多