2014-07-17 169 views
0

我有两个插入语句插入数据库中的记录。我已经使用了事务范围,以便在任何语句失败的情况下,没有任何记录被更新。在第二个过程中,插入失败,但它将数据库中的记录插入到第一个语句中。我在代码中缺少什么?交易范围c#

连接字符串

<add name="Transac.Properties.Settings.TransacDbConnectionString" connectionString="Data Source=.\sqlexpress;Initial Catalog=Transac;Integrated Security=True" providerName="System.Data.SqlClient" /> 

private void button1_Click(object sender, EventArgs e) { 
    var scopeOptions = new TransactionOptions(); 
    scopeOptions.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted; 
    scopeOptions.Timeout = TimeSpan.MaxValue; 

    using (TransactionScope transactionScope = new TransactionScope(TransactionScopeOption.Required,scopeOptions)) { 
     try { 

       cmd = new SqlCommand("SalesSave", con); 
       cmd.CommandType = CommandType.StoredProcedure; 

       cmd.Parameters.Add(new SqlParameter("@BillNo", lblBillNo.Text)); 
       cmd.Parameters.Add(new SqlParameter("@CustName", cboCust_Name.Text.ToUpper())); 
       cmd.Parameters.Add(new SqlParameter("@Mobile", txtMob.Text)); 
       cmd.ExecuteNonQuery(); 


       cmd = new SqlCommand("SubSave", con); 
       cmd.CommandType = CommandType.StoredProcedure; 
       cmd.Parameters.Add(new SqlParameter("@SubBillNo", lblBillNo.Text)); 
       cmd.Parameters.Add(new SqlParameter("@ItemName", dataGridView1.Rows[i].Cells[0].Value.ToString().ToUpper())); 
       cmd.Parameters.Add(new SqlParameter("@Qty", dataGridView1.Rows[i].Cells[1].Value.ToString())); 
       //cmd.Parameters.Add(new SqlParameter("@Price", dataGridView1.Rows[i].Cells[2].Value.ToString())); 
       cmd.ExecuteNonQuery(); 

      transactionScope.Complete(); 
      transactionScope.Dispose(); 
     } 
     catch (Exception e1) { 
      MessageBox.Show(e1.Message); 
     } 
    } 
} 

存储过程1:

ALTER PROCEDURE [dbo].[SalesSave] 
( 
    @SalesBillNo as varchar(50), 
    @CustName as varchar(50), 
    @Mobile as nvarchar(50) 

) 
AS 
    begin 
     insert into Sales(

         SalesBillno, 
         CustName, 
         Mobile 

         ) 

       values (

         @SalesBillNo, 
         @CustName, 
         @Mobile 

         ) 
    end 

存储过程2

ALTER PROCEDURE [dbo].[SubSave] 
@SubSalesBillNo as varchar(50), 
@ItemName as nvarchar(50), 
@Qty as money, 
@Price as money 

AS 
    begin 
     INSERT INTO SubSales 
     VALUES(
       @SubSalesBillNo, 
       @ItemName, 
       @Qty, 
       @Price 
       ) 
    end 
+2

您的消息框是否显示第二个存储过程中的异常? 为什么当你有一个Using块时调用dispose? – Adam47

+0

是的,它显示第二个存储过程中的异常,因为我已经明确地评论了一个参数,所以它会抛出错误,事务将回滚但不是。之前我使用的是交易声明,这就是为什么处置在那里我会删除它 – NoviceToProgramming

+1

真正的问题是:根本使用3个交易的目的是什么?另外:只有一个命令使用转换的目的是什么? –

回答

1

我相信你必须打开事务范围内的数据库连接,并利用它来进行这工作。

+0

你节省了我的一天的人..只是在事务范围内添加了一个连接,它的工作原理..非常感谢... :)但有一个问题,为什么它在事务范围内使用连接? – NoviceToProgramming

+1

在connection.Open()调用期间,.NET框架会查找任何活动的事务作用域,以便打开的连接应该被注册。 –