2013-05-01 59 views
0

我希望做某种延迟回滚(未在批)在样品C#桌面应用 1按钮插入数据,其他的辊回延迟回滚(ado.net)不工作

我试图以下但它不起作用

error: The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION. 

private void button1_Click(object sender, EventArgs e) 
    { 
     SqlConnection conn = new SqlConnection(ConnectionString); 
     //conn = new SqlConnection(ConnectionString); 
     conn.Open(); 
     try 
     { 
      //tran = conn.BeginTransaction("Transaction1"); 
      SqlCommand cmd = new SqlCommand("begin transaction", conn); 
      SqlCommand cmd1 = new SqlCommand("insert into employee values ('6','aaaaaa','111')", conn); 
      cmd.ExecuteNonQuery(); 
      cmd1.ExecuteNonQuery(); 
      conn.Close(); 

     } 
     catch { } 
    } 
    private void button2_Click(object sender, EventArgs e) 
    { 
     SqlConnection conn = new SqlConnection(ConnectionString); 
     conn.Open(); 
     SqlCommand cmd2 = new SqlCommand("rollback transaction", conn); 
     cmd2.ExecuteNonQuery(); 
     conn.Close(); 
    } 

是我试图甚至有可能吗?还是我只是以错误的方式去做?

+0

你有什么想法吗? – granadaCoder 2013-05-07 18:58:11

+0

只要连接在两个按钮之间共享即可。 一旦关闭并重新打开,两种方式都不起作用。 – AngelicCore 2013-05-08 09:43:03

回答

0

Youch。

技术上,您在button2_Click中的所有内容都是“新的”,因此没有与原始“begin transaction”语句“绑定”。

但我真的不认为你想做手动的“开始事务”和“回滚事务”语句。

我~~想~~你想尝试,使这个变量:

**tran** = conn.BeginTransaction("Transaction1"); 

这种“过渡”变量的成员变量,其范围比一个命令按钮更大。 (比方说,你让一个成员变量,并重新命名为_transaction)

,然后要么调用

_transaction.Rollback(); 

_transaction.Commit() 

但哇。这是flakey。如果你真的想要这样做,我只是给你一个想法。

+0

:)其实我已经开始在那里..但想要按我的方式做,因为它似乎更手动 我认为这将工作,因为我发送这些语句到数据库引擎。 和Sql Server中,这些命令不必在同一批次中执行 – AngelicCore 2013-05-01 20:52:47

+0

我不知道“你的方式”是否真的有效。但是为了尝试它,你必须允许(SqlCommand cmd = new SqlCommand(“begin transaction”,conn);)的范围比命令按钮更大。它至少需要是一个成员变量。你会得到这个错误,因为第一个cmd在button1_click之后超出了范围,所以button_2“rollback tran”不知道你在说什么,因此你的错误。 – granadaCoder 2013-05-01 20:54:51

+0

会尝试并找回你 – AngelicCore 2013-05-01 23:13:49