我有一个包含两个表的数据集。表[0]填充了多行。然后我需要迭代这些行,并为每一行运行另一个查询并将这些结果填充到表[1]。在循环中用多行填充数据集的正确方法是什么?我所在的缩写代码示例:
DataSet ds = new DataSet();
sql = myquery1;
SqlDataAdapter da = new SqlDataAdapter(sql, conn);
da.Fill(ds, "Products");
foreach (DataRow dr in ds.Tables[0].Rows)
{
productID = ds.Tables[0].Rows[0]["ProductID"].ToString();
if (productID != String.Empty)
{
sql = String.Empty;
sql = myquery2 where productID = 'xxxxx'
da = new SqlDataAdapter(sql, conn);
da.Fill(ds, "ProductProperties");
}
}
这会在第一个循环中填充“ProductProperties”数据表,但不会添加将来的结果。将多个结果集添加到数据表的正确方法是什么?
答案 0 :(得分:1)
你这是错误的方式。您只需要一个查询来填充子表。 E.g。
Dim ds As New DataSet
Using connection As New SqlConnection("connection string here"),
parentAdapter As New SqlDataAdapter("SELECT * FROM ParentTable",
connection),
childAdapter As New SqlDataAdapter("SELECT * FROM ChildTable WHERE ParentID IN (SELECT ParentID FROM ParentTable)",
connection)
connection.Open()
parentAdapter.Fill(ds, "Parent")
parentAdapter.Fill(ds, "Child")
End Using
您需要做的就是将父查询复制为子表的子查询。如果需要,您甚至可以将两个查询放在一个数据适配器中。关键是没有必要遍历父记录并为每个记录执行单独的查询。
答案 1 :(得分:0)
您的查询应返回两个记录集
SELECT ProductId, Name
FROM Products
SELECT ProductId, Property1, Property2
FROM ProductProperties
然后,您可以将以上查询中的数据读取到DataSet,如下所示。因此,您将在DataSet中获得两个表,其中包含来自上述查询的两个记录集的结果
using (SqlConnection con = new System.Data.SqlClient.SqlConnection(connString))
{
using (SqlCommand cmd = new SqlCommand())
{
cmd.CommandText = "query";
cmd.Connection = con;
con.Open();
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
adapter.Fill(ds);
con.Close();
}
}