【发布时间】:2018-05-15 08:30:33
【问题描述】:
我想执行一个查询,选择所有个客户,以及每个客户的对应地址。每个客户可以有零个、一个或多个地址。
这是我尝试过的:
sql = "SELECT customers.*, addresses.* FROM customers LEFT JOIN addresses ON addresses.CustomerId = customers.Id ORDER BY customers.Id OFFSET @start ROWS FETCH NEXT @end ROWS ONLY";
List<SqlParameter> parameters = new List<SqlParameter>();
parameters.Add(new SqlParameter("@start", limitStart));
parameters.Add(new SqlParameter("@end", limitEnd));
DataSet set = Db.ExecuteSelectQuery(sql, parameters);
DataTable table = set.Tables["customers"];
Console.WriteLine("Tables count: " + set.Tables.Count); // says there's 1 table.
List<Customer> customers = new List<Customer>();
foreach(DataRow row in table.Rows)
{
Customer cust = new Customer();
cust.Id = row.Field<int>("Id");
cust.ClientNumber = row.Field<string>("clientnumber");
cust.Date = DateTime.Parse(row.Field<string>("date"));
cust.Firstname = row.Field<string>("firstname");
cust.Insertion = row.Field<string>("insertion");
cust.Lastname = row.Field<string>("lastname");
foreach(DataRow addrRow in /* ......?...... */) // Want to loop through addresses of the current customer row.
{
Address address = new Address();
address.Street = addrRow.Field<string>("Street");
address.HouseNumber = addrRow.Field<string>("Number");
address.PostalCode = addrRow.Field<string>("PostalCode");
address.City = addrRow.Field<string>("City");
address.Country = 0;// row.Field<int>("CountryCode");
cust.Addresses.Add(address);
}
customers.Add(cust);
}
return customers;
问题是我不知道如何使用SqlClient 的DataTable 和DataSet 类来处理查询结果。
我在 Internet 上找不到任何解释如何访问每个客户的选定地址的方法。
谁能给我解释一下,或者给我看一个代码示例?
【问题讨论】:
-
这可能会有所帮助。您是否定义了两个表之间的关系? msdn.microsoft.com/en-us/library/hbt8xha8(v=vs.110).aspx
-
当我尝试添加一个
DataRelation时,该关系在其构造函数中要求两个DataColumns。为了访问这些列,我尝试使用set.Tables来获取一个表,并从该表对象中获取列。但问题之一是该集合仅包含一个表。 (请参阅我的代码的控制台编写)。 -
Db.ExecuteSelectQuery使用此查询只会在一个表中得到结果,每行都有表客户和地址的字段,在您的循环中检查 customerId 是否与前一个不同,将新客户添加到列表并检查另一个这样的地址列表
标签: c# sql .net sql-server database