我正在研究sql,我的查询是我有一些方法,我在做不同的任务。例如:- 第一种方法 - 插入 第二种方法 - 更新 第三种方法 - 删除 第四种方法 - 插入
现在我想一次执行所有这些。但如果出现任何错误,那么整个过程就会自行回滚。
代码:
private void btnSubmit_Click(object sender, EventArgs e)
{
DialogResult dr = MessageBox.Show("Are you sure you want to submit the information? Click 'Yes' to Submit or 'No' to re-Check.", "eParty - Confirmation", MessageBoxButtons.YesNo, MessageBoxIcon.Information);
if (dr == DialogResult.Yes)
{
this.Cursor = Cursors.WaitCursor;
INSERT();
UPDATE();
DELETE();
INSERTAGAIN();
MessageBox.Show("Booked successfully.", "eParty - Done!", MessageBoxButtons.OK, MessageBoxIcon.Information);
this.Cursor = Cursors.Default;
this.Cursor = Cursors.WaitCursor;
this.Close();
}
else
{
}
}
现在如何在'btnSubmit_Click'方法实现Transaction ...
答案 0 :(得分:2)
试试这个:
using(var scope = new TransactionScope())
{
INSERT();
UPDATE();
DELETE();
INSERTAGAIN();
scope.Complete(); //if we make it here - commit the changes,
//if not - everything is rolled back
}
请记住将System.Transactions
包含在项目中
答案 1 :(得分:0)
这取决于您拥有的数据库访问技术。
如果您使用实体框架,SaveChanges()
方法已经拥有交易支持。
如果是纯ADO.NET,请参阅此https://stackoverflow.com/a/224702/210994
答案 2 :(得分:0)
您可以使用ADO交易并将交易作为参数发送到您的所有方法
SqlConnection db = new SqlConnection("connstringhere");
SqlTransaction transaction;
db.Open();
transaction = db.BeginTransaction();
try
{
INSERT(transaction);
UPDATE(transaction);
DELETE(transaction);
INSERT(transaction);
transaction.Commit();
}
catch (SqlException sqlError)
{
transaction.Rollback();
}
答案 3 :(得分:0)
请参阅此主题:Implementing an Implicit Transaction using Transaction Scope。
TransactionScope类提供了一种标记块的简单方法 代码参与交易,无需您 与交易本身互动。事务范围可以选择 并自动管理环境事务。由于它的易用性 使用和效率,建议您使用 开发事务应用程序时的TransactionScope类。在 另外,你不需要明确地用资源登记资源 交易即可。任何System.Transactions资源管理器(例如SQL) Server 2005)可以检测环境事务的存在 由范围创建并自动登记。
我还建议您阅读此question及其答案。它涉及有关在多个连接上使用事务的有趣话题。
答案 4 :(得分:0)
通常类似于:
void DoStuff(args)
{
using (var conn = CreateOpenConnection())
using (var tran = conn.BeginTransaction())
{
try
{
// various operations here
ForExample(conn, tran);
tran.Commit();
}
catch
{
tran.Rollback();
throw;
}
}
}
void ForExample(DbConnection conn, DbTransaction tran = null)
{
using (var cmd = conn.CreateCommand())
{
cmd.Transaction = tran;
cmd.CommandText = "For example";
// cmd.Parameters.Add(...)
cmd.ExecuteNonQuery();
}
}
虽然可以使用原始ADO.NET上方的任何可用工具/库来减少大部分工作/库。
答案 5 :(得分:0)
您可以使用.Net的TransactionScope类来实现此目的。 http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.aspx 您可以根据需要选择隔离级别。如果您不确定,请使用Serializable级别,该级别是最一致且性能最低的级别。但是如果你的sql存储过程具有隔离级别,它们将获得优先权。如果这是一个关键设计,请在继续之前阅读有关交易的信息。
答案 6 :(得分:0)
也许你应该创建一个存储过程并根据参数执行你的CRUD操作。例如:
BEGIN TRANSACTION
IF(@PartyID <= 0)
BEGIN
//INSERT
IF @@ERROR <> 0
BEGIN
ROLLBACK TRANSACTION
RETURN
END
END
ELSE
BEGIN
//UPDATE
IF @@ERROR <> 0
BEGIN
ROLLBACK TRANSACTION
RETURN
END
END