在最常见的情况下,我们在 DB 中有两个表(及更多),称为主表(例如SalesOrderHeader
)和子表(例如SalesOrderDetail
)。我们可以通过一个 Select和INNER JOIN
附加约束从 DB 中读取记录,WHERE
以减少从 DB 加载的数据量(使用"Addater.Fill(DataSet)"
)
@"SELECT d.SalesOrderID, d.SalesOrderDetailID, d.OrderQty,
d.ProductID, d.UnitPrice
FROM Sales.SalesOrderDetail d
INNER JOIN Sales.SalesOrderHeader h
ON d.SalesOrderID = h.SalesOrderID
WHERE DATEPART(YEAR, OrderDate) = @year;"
我理解对了吗,在这种情况下,我们在 DataSet 中收到一个表,没有主键和外键,也没有可能在主表和子表之间设置约束。
此数据集仅对有关数据集中存在的列和记录的不同查询有用吗?我们不能DbCommandBuilder
根据用于填充 DataSet 的 SelectCommand 为 Insert、Update、Delete 创建 SQLCommands 吗?并简单地更新数据库中这些表中的数据?
如果我们想通过ADO.NET的断开层来组织表中的本地数据修改,我们必须通过两个Select填充DataSet
"SELECT *
FROM Sales.SalesOrderHeader;"
"SELECT *
FROM Sales.SalesOrderDetail;"
之后,我们必须为两个表创建主键,并在主表和子表之间设置约束。由DbCommandBuilder
SQLCommands 为插入、更新、删除创建。
在这种情况下,我们将有可能远程修改这些表中的数据,并在更新数据库中的记录之后(使用"Addater.Update(DataSet)"
)。
如果我们将使用一个SelectCommand
来加载 DataSet 中两个表中的数据,我们是否可以使用它SelectCommand
来 DbCommandBuilder
为“更新”创建其他 SQLCommands 并将 DataSet 中的所有表更新为一个"Addater.Update(DataSet)"
,或者我们必须为更新每个表创建单独的 Addapter?
如果我为经济资源将仅从表(例如 SalesOrderDetail)加载部分记录(见下文)。我是否正确理解,在这种情况下,当我将新记录发送到数据库(通过更新)时,我可能会遇到问题,因为新闻记录可能与数据库中存在的主键冲突(某些记录在OrderDate
场地)?
"SELECT *
FROM Sales.SalesOrderDetail
WHERE DATEPART(YEAR, OrderDate) = @year;"