在大多数情况下,数据库中有两个表(&更多),分别称为主表(例如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;"
答案 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