在最常见的情况下,我们在 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;"
之后,我们必须为两个表创建主键,并在主表和子表之间设置约束。由DbCommandBuilderSQLCommands 为插入、更新、删除创建。
在这种情况下,我们将有可能远程修改这些表中的数据,并在更新数据库中的记录之后(使用"Addater.Update(DataSet)")。
如果我们将使用一个SelectCommand来加载 DataSet 中两个表中的数据,我们是否可以使用它SelectCommand来 DbCommandBuilder为“更新”创建其他 SQLCommands 并将 DataSet 中的所有表更新为一个"Addater.Update(DataSet)",或者我们必须为更新每个表创建单独的 Addapter?
如果我为经济资源将仅从表(例如 SalesOrderDetail)加载部分记录(见下文)。我是否正确理解,在这种情况下,当我将新记录发送到数据库(通过更新)时,我可能会遇到问题,因为新闻记录可能与数据库中存在的主键冲突(某些记录在OrderDate场地)?
"SELECT *
FROM Sales.SalesOrderDetail
WHERE DATEPART(YEAR, OrderDate) = @year;"