为数据集选择记录的策略

时间:2019-12-07 00:51:59

标签: ado.net dataset adapter sqlcommandbuilder selectcommand

在大多数情况下,数据库中有两个表(&更多),分别称为主表(例如SalesOrderHeader和手卷(例如SalesOrderDetail)。 我们可以通过一次选择INNER JOIN和其他内容WHERE来从DB中读取记录,以减少用于从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中收到一个表,没有主键和外键,也没有在主表和子表之间设置约束的可能性。

此数据集仅可用于有关数据集中存在的列和记录的不同查询? 我们不能基于填充数据集的SelectCommand使用DbCommandBuilder创建用于插入,更新和删除的SQLCommand吗?只是简单地更新数据库中这些表中的数据?

如果要使用ADO.NET的断开连接层在表中组织本地数据修改,则必须通过两个Select

填充DataSet
"SELECT *
FROM Sales.SalesOrderHeader;"
"SELECT *
FROM Sales.SalesOrderDetail;"

此后,我们必须为两个表创建主键,并设置主表和子表之间的约束。通过DbCommandBuilder SQL命令创建用于插入,更新,删除的

在这种情况下,我们将有可能远程更新这些表中的所有修改数据,并在更新数据库中的记录之后(使用"Addater.Update(DataSet)")。

如果我们将使用一个SelectCommand来加载DataSet中两个表中的数据,是否可以使用SelectCommand的那个DbCommandBuilder来创建其他SQLCommand来“更新”并更新其中的所有表通过"Addater.Update(DataSet)"设置数据集,还是必须为每个表创建单独的Addapter来更新?

如果我出于经济考虑,资源将仅加载表(例如SalesOrderDetail)中的部分记录(请参见下文)。我是否正确理解,在这种情况下,当我将新记录发送到数据库(通过Update)时,我可能会遇到问题,因为新闻记录可能与通过主键存在于数据库中的冲突(某些记录具有其他值。 OrderDate字段)?

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

1 个答案:

答案 0 :(得分:0)

没有什么可以阻止您为带有联接的第一个select语句编写自己的Insert,Update和Delete命令的。当然,您将必须确定一种确保外键存在的方法。

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