带有SqlTransaction的ExecuteScalar()

时间:2014-11-13 17:49:01

标签: c# sql-server

我正在尝试使用sqltransaction和executioncalar对数据库进行两次插入,以返回第一个插入的输出ID。

这是代码:

try
    {
      using (SqlConnection conn = new SqlConnection("ConnectionString"))
         {
           conn.Open();

           SqlTransaction safetransaction = conn.BeginTransaction();

           foreach (var dado in NFSe)
              {

                SqlCommand cmd_NFSe = new SqlCommand("SqlCommand", conn, safetransaction);


                var newID = cmd_NFSe.ExecuteScalar();

                foreach (var serv in Servico)
                   {

                     string ID = newID.Tostring(); 

                     SqlCommand cmd_NFSeServ = new SqlCommand("SqlCommand", conn, safetransaction);


                     cmd_NFSeServ.ExecuteNonQuery();
                   }                                

               }
          }
     }

 catch (SqlException ex)
     {
        MessageBox.Show(ex.ToString());
     }

但这不起作用。没有任何内容插入到数据库中,我没有得到任何错误或异常,只是没有任何反应。

如果我使用相同的代码但没有sqltransaction,一切都很好。

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

您需要致电safetransaction.Commit();

答案 1 :(得分:1)

你错过了很多东西

  1. 提交交易
  2. 回滚交易
  3.   

    如果出现任何错误,该事务将回滚   没有先提交

    试试这个:

    try
        {
          using (SqlConnection conn = new SqlConnection("ConnectionString"))
             {
               conn.Open();
    
               SqlTransaction safetransaction = conn.BeginTransaction();
    
               foreach (var dado in NFSe)
                  {
    
                    SqlCommand cmd_NFSe = new 
                    SqlCommand("SqlCommand", conn, safetransaction);
                    cmd_NFSe.Connection = connection;
                    cmd_NFSe.Transaction = transaction;
    
                    var newID = cmd_NFSe.ExecuteScalar();
    
                    foreach (var serv in Servico)
                       {
    
                         string ID = newID.Tostring(); 
    
                         SqlCommand cmd_NFSeServ = new 
                         SqlCommand("SqlCommand", conn, safetransaction);
    
    
                         cmd_NFSeServ.ExecuteNonQuery();
                         cmd_NFSe.Commit();
                       }                                
    
                   }
              }
         }
    
     catch (SqlException ex)
         {
    
            cmd_NFSe.Rollback();
            MessageBox.Show(ex.ToString());
         }
    

答案 2 :(得分:1)

我希望您展示一些SQL,以便我们可以看到您正在做的事情,但我必须假设您有一个标识列,您将从中获取新ID。我希望避免多次访问服务器,因此您可能很清楚,您可以在一次调用中组合多个SQL语句,方法是将它们与";"分开。该单个调用中的所有语句都是事务性的,因此您的整体代码将更小,并且减少了到服务器的次数,也更快。 IE:

INSERT INTO MyTable (MyField) VALUES ('Test1'); Select SCOPE_IDENTITY(); INSERT INTO MyTable (MyField) VALUES ('Test2'); Select SCOPE_IDENTITY()

现在将它与DataAdapter.Fill一起使用,您将获得一个包含2个表的DataSet,每个表都具有插入的新ID。

哦,对于您的原始问题,您需要提交您的交易:safetransaction.Commit();