使用VB.NET DataRow类从SQL关联表获取数据的问题
解决方案
方法一:使用SQL JOIN一次性获取关联数据
直接修改查询语句,通过INNER JOIN关联三个表,把需要的客户和产品字段一并查询出来,遍历DataRow时即可直接读取对应值。
修改后的VB代码示例:
' 构造关联查询的SQL语句 dim da as New SqlClient.SqlDataAdapter( _ "SELECT o.id AS OrderId, o.date AS OrderDate, " & _ "c.name AS CustomerName, c.surname AS CustomerSurname, " & _ "p.name AS ProductName " & _ "FROM Orders o " & _ "INNER JOIN Customers c ON o.customerId = c.id " & _ "INNER JOIN Products p ON o.productId = p.id", conn) dim ds as New DataSet da.fill(ds, vt) For each dr as DataRow in ds.Tables(vt).rows orderId = dr("OrderId") orderDate = dr("OrderDate") ordererName = dr("CustomerName") ordererSurname = dr("CustomerSurname") productName = dr("ProductName") ' 后续业务逻辑 Next
说明:
- 用表别名(o、c、p)简化SQL语句结构
- 给字段取别名(如OrderId、CustomerName)避免不同表的同名字段冲突
- 如果需要包含无对应客户/产品的订单,可将
INNER JOIN替换为LEFT JOIN
方法二:使用DataSet的DataRelation关联表
若需要保留DataSet中三个表的独立结构,可分别填充三个表后创建数据关联,再通过DataRow的关联方法获取对应数据。
示例代码:
' 分别填充三个表到DataSet dim daOrders as New SqlClient.SqlDataAdapter("SELECT * FROM Orders", conn) dim daCustomers as New SqlClient.SqlDataAdapter("SELECT * FROM Customers", conn) dim daProducts as New SqlClient.SqlDataAdapter("SELECT * FROM Products", conn) dim ds as New DataSet daOrders.Fill(ds, "Orders") daCustomers.Fill(ds, "Customers") daProducts.Fill(ds, "Products") ' 创建Orders与Customers的关联关系 ds.Relations.Add("OrderToCustomer", _ ds.Tables("Customers").Columns("id"), _ ds.Tables("Orders").Columns("customerId")) ' 创建Orders与Products的关联关系 ds.Relations.Add("OrderToProduct", _ ds.Tables("Products").Columns("id"), _ ds.Tables("Orders").Columns("productId")) ' 遍历订单并获取关联数据 For each drOrder as DataRow in ds.Tables("Orders").Rows orderId = drOrder("id") orderDate = drOrder("date") ' 获取关联的客户行数据 dim drCustomer as DataRow = drOrder.GetParentRow("OrderToCustomer") ordererName = drCustomer("name") ordererSurname = drCustomer("surname") ' 获取关联的产品行数据 dim drProduct as DataRow = drOrder.GetParentRow("OrderToProduct") productName = drProduct("name") ' 后续业务逻辑 Next
说明:
GetParentRow方法通过关联名称获取父表(Customers、Products)的对应行- 该方法适合需要多次操作不同表数据的场景,比如后续需更新客户或产品信息
内容的提问来源于stack exchange,提问作者ilkay kurt
相关产品推荐
相关产品推荐

