C# 仅使用与主表相关的行填充从属表

C# 仅使用与主表相关的行填充从属表,c#,datatable,dataset,relationship,sqldataadapter,C#,Datatable,Dataset,Relationship,Sqldataadapter,假设我有一个巨大的订单表和另一个更大的订单明细表 我有一个数据集,它由两个SqlDataAdapters填充。第一个选择指定客户的订单。第二个应选择指定客户订单的订单详细信息(由第一个SqlDataAdapter选择)。但我找不到一个优雅的方式来做这件事。当我添加关系时,我得到一个错误,说“不能启用此约束,因为不是所有值都有相应的父值” 我不想在创建关系时禁用约束创建,我也不想选择第二个表的所有行。有没有合适的方法?或者唯一的方法是在子句中使用f.e.构建SQL语句?现在,正如我所理解的,无论我

假设我有一个巨大的订单表和另一个更大的订单明细表

我有一个
数据集
,它由两个
SqlDataAdapter
s填充。第一个选择指定客户的订单。第二个应选择指定客户订单的订单详细信息(由第一个
SqlDataAdapter
选择)。但我找不到一个优雅的方式来做这件事。当我添加关系时,我得到一个错误,说“不能启用此约束,因为不是所有值都有相应的父值”

我不想在创建关系时禁用约束创建,我也不想选择第二个表的所有行。有没有合适的方法?或者唯一的方法是在子句中使用f.e.
构建SQL语句?现在,正如我所理解的,无论我是在填充表之前还是之后添加此关系,我都会在填充表之后添加关系时收到此消息,或者在填充第二个表时收到此消息(如果关系是在数据填充之前添加的)

代码示例:
您需要使用客户的相关订单详细信息填充
DetailsAdapter
;只有这样,才能在两者之间建立关系

比如

SELECT * FROM dbo.OrderDetails INNER JOIN dbo.Orders ON OrderDetails.OrderID =
Orders.OrderID WHERE Orders.CustomerId = ...

但是,在现实中,不要对您的查询这样做。使用存储过程(查询在db服务器上编译,因此性能更好),或者,如果必须使用内联SQL,请使用
SqlParameter
类以避免SQL注入

也许没有什么能阻止我提供

'1;DROP TABLE Orders;'

作为我要搜索的客户ID的值,当附加到您的查询中时,它将成为您真正不希望执行的内容。

让我们看看代码。假设每个订单细节都必须有一个父订单,因此如果所有数据都正确,这样的关系就会起作用。关系是否应用于正确的列,它们是否都不可为空等?@barrick,当然,每个订单详细信息必须有一个父订单,但我只选择了指定客户的订单,而不是所有订单,这使得没有
Where
子句的select order detail无法使用。我不明白的是,为什么
数据集中的两个表之间不能添加
数据关系
,如果第一个表包含一个人的所有订单,第二个表包含这些订单的所有订单详细信息。如果两者都有,例如,
OrderID
,则表明数据的存储方式或检索方式有问题。你能举个例子吗?@barrick,请看一看,不确定它是否可以编译,想法应该很清楚。好的,我明白了。给出的答案看起来是你想要的;我没有意识到你没有得到客户订单的详细信息。是的,谢谢,我知道,这不是你知道的真实代码:)在实际任务中,如果输入来自用户,我使用
SqlParameter
s。。。虽然我希望有一种简洁的方式来执行这类任务,也许可以使用某种dotNet的内部轮子,而不必为编写SQLs而烦恼。。。
'1;DROP TABLE Orders;'