0

在最常见的情况下,我们在 DB 中有两个表(及更多),称为主表(例如SalesOrderHeader)和子表(例如SalesOrderDetail)。我们可以通过一个 SelectINNER 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 中两个表中的数据,我们是否可以使用它SelectCommandDbCommandBuilder为“更新”创建其他 SQLCommands 并将 DataSet 中的所有表更新为一个"Addater.Update(DataSet)",或者我们必须为更新每个表创建单独的 Addapter?

如果我为经济资源将仅从表(例如 SalesOrderDetail)加载部分记录(见下文)。我是否正确理解,在这种情况下,当我将新记录发送到数据库(通过更新)时,我可能会遇到问题,因为新闻记录可能与数据库中存在的主键冲突(某些记录在OrderDate场地)?

"SELECT *
FROM Sales.SalesOrderDetail
WHERE DATEPART(YEAR, OrderDate) = @year;"
4

1 回答 1

0

没有什么可以阻止您为带有连接的第一个选择语句编写自己的插入、更新和删除命令。当然,您必须确定一种方法来确保外键存在。

Insert Into SalesOrderDetail (SalesOrderID, OrderQty, ProductID, UnitPrice) Values ( @SalesOrderID, @OrderQty, @ProductID, @UnitPrice);

Update SalesOrderDetail Set OrderQty = @OrderQty Where SalesOrderDetailID = @ID;

Delete From SalesOrderDetail Where SalesOrderDetailID = @ID;

您将使用 ADO.net 命令而不是使用适配器来执行这些操作。我在 vb.net 中编写了示例代码,但我相信如果您愿意,可以轻松更改为 C#。

Private Sub UpdateQuantity(Quant As Integer, DetailID As Integer)
    Using cn As New SqlConnection("Your connection string"),
            cmd As New SqlCommand("Update SalesOrderDetail Set OrderQty = @OrderQty Where SalesOrderDetailID = @ID;")
        cmd.Parameters.Add("@OrderQty", SqlDbType.Int).Value = Quant
        cmd.Parameters.Add("@ID", SqlDbType.Int).Value = DetailID
        cn.Open()
        cmd.ExecuteNonQuery()
    End Using
End Sub
于 2019-12-10T13:53:38.983 回答