【问题标题】:How to print value from LEFT JOIN through SqlDataReader?如何通过 SqlDataReader 从 LEFT JOIN 打印值?
【发布时间】:2020-09-28 17:00:28
【问题描述】:

我已经创建了这个“ShowSubcategories”方法,它工作得很好!

我还尝试使用内置命令“SqlDataReader”这似乎工作得很好, 直到我尝试使用左连接来输出实际的类别名称,而不仅仅是 sdr[2] 中的类别 ID。

我应该如何在 sqldatareader 中使用左连接输出,否则在这里尝试? sdr["类别名称"]

public static void ShowSubCategories(SqlConnection conn)
{
    string SQL = (@"SELECT SubCategoryID, SubCategoryName, CategoryID, 
                  SubCategoryEmployeeID FROM SubCategories
                  left join Categories on SubCategories.CategoryID=Categories.CategoryID");
    SqlCommand command = new SqlCommand(SQL, conn);
    SqlDataReader sdr = command.ExecuteReader();
    while (sdr.Read())
    {
        Console.WriteLine("{0,-5} {1,-10} {2,-10} {3,-10}", sdr[0], sdr[1], sdr["CategoryName"], sdr[3]);
    }
    sdr.Close();
}

【问题讨论】:

  • 结果中一开始就没有CategoryName 列。 DbDataReader用于读取服务器返回的结果,不能修改查询
  • 在 C# 中尝试之前先在 SQL Server Management Studio 中测试查询。如果查询中有错误,SSMS 会显示错误,而 c# 不会。

标签: c# sql left-join sqldatareader


【解决方案1】:

查询只能返回 SELECT 语句之后出现的字段。
如果 CategoryName 属于表 Categories 则需要将其添加到 SELECT 语句中。

在这些情况下,最好创建表名 ALIAS(表示查询中表名的短字符串)。如您所见,查询更清晰,文字更短

public static void ShowSubCategories(SqlConnection conn)
{
    string SQL = (@"SELECT sc.SubCategoryID, sc.SubCategoryName, sc.CategoryID, 
                           sc.SubCategoryEmployeeID, c.CategoryName 
                    FROM SubCategories sc
                       LEFT JOIN Categories c ON sc.CategoryID=c.CategoryID");
    SqlCommand command = new SqlCommand(SQL, conn);
    SqlDataReader sdr = command.ExecuteReader();
    while (sdr.Read())
    {
        Console.WriteLine("{0,-5} {1,-10} {2,-10} {3,-10}", sdr[0], sdr[1], sdr["CategoryName"], sdr[3]);
    }
    sdr.Close();
}

另请注意,当您从 DataReader 中提取值时,您不需要在字段名称前加上别名。

【讨论】:

  • 在资源处置方面,把原代码做的更好一点是个好主意。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多