C# 在使用C将事务提交到SQL Server之前备份原始行数据#

C# 在使用C将事务提交到SQL Server之前备份原始行数据#,c#,sql-server-2008,transactions,rollback,C#,Sql Server 2008,Transactions,Rollback,我希望能够备份表中已修改或删除的行的所有原始数据。我还希望跟踪所有插入的行。这样做的原因是,我的应用程序将有一个用户在其上更改对数据库的更改,我不想提交更改,直到用户确认所有更改都是正确的 我该怎么做呢?我查看了TransactionScope和Transaction类,但是如果程序要对100个不同的表进行100次更新怎么办。如果我的理解是正确的,那么我需要100个不同的线程,直到用户确认更改是正确的?我是在搜索提交和回滚事务时遇到的 帮助:(如果您正在等待用户输入,则不应让事务始终处于打开状态

我希望能够备份表中已修改或删除的行的所有原始数据。我还希望跟踪所有插入的行。这样做的原因是,我的应用程序将有一个用户在其上更改对数据库的更改,我不想提交更改,直到用户确认所有更改都是正确的

我该怎么做呢?我查看了TransactionScope和Transaction类,但是如果程序要对100个不同的表进行100次更新怎么办。如果我的理解是正确的,那么我需要100个不同的线程,直到用户确认更改是正确的?我是在搜索提交和回滚事务时遇到的


帮助:(

如果您正在等待用户输入,则不应让事务始终处于打开状态。事务更适合处理数据库本身内的低级回滚,或处理管理数据库操作的.NET代码中的低级回滚


如果您正在等待用户输入,请将临时数据存储在另一个表中,直到您得到它们的确认,然后将数据移动到其最终位置。

因为您希望跟踪所有更改的行,所以您的问题与事务无关。事务是为了在两个命令之间发生错误时保持数据库的完整性。我认为您需要一个撤消/重做历史模型

您可以通过使用其他表来解决问题。一个表用于保留所有更改,另一个表用于指出已批准的更改版本。对于产品表,它可能类似于:

Products Table
RowId | ProductId | ProductName | Description | Price | ChangingTime

ApprovedProducts Table
ProductId | RowId

每当用户更新产品时,您将一个新行添加到
Products
表中,您可以使用
ApprovedProducts
表中的
RowId
指向所需的行。

我认为您应该让数据库来完成此操作,您可以在插入、更新和删除时编写触发器,并保存新数据和旧数据。在前端e上执行此操作nd是不推荐的,触发器容易移植到任何数据库引擎


关于,

为什么不存储更改直到用户确认,而不是在用户不确认时进行更改并回滚?您说:“我希望能够备份表中已修改或删除的行的所有原始数据。”。这些“备份”记录的预期寿命是多久?我认为您采取的方法根本不正确。您应该跟踪用户想要进行的更改,并且只将其写入数据库(当然是在事务内部)一旦用户确认了它们。您可以使用诸如EntityFramework之类的OR/M来执行此操作,或者您可以使用类似于
DataTable
的类,该类具有
AcceptChanges
GetChanges
方法。只有在用户决定提交更新后,您才会调用
AcceptChanges
。因为我想为了以防万一,他们后来意识到它出错了。主要原因是为了防止应用程序\用户出错,其次是为了在出现逻辑\设计错误的情况下进行备份……备份的寿命从一小时到两周不等。对于特定的客户,通常只有1-50行数据r、 我喜欢这个想法…但我仍然不知道如何实现它。如果我通过SqlCommand发送UPDATE\INSERT\DELETE命令,如何检测哪些行正在被修改\插入。我的第一个猜测是解析该命令,然后为修改\插入的行生成查询并将数据保存到表中?…但是解析SQL命令是不可行的难点:-(无论何时修改产品,您都会将修改后的产品(或新产品,如果是新产品)添加到Products表中。因此,实际上您永远不会发送Products表的UPDATE或DELETE命令。您只会插入。