首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ExecuteScalar()与SqlTransaction

ExecuteScalar()与SqlTransaction
EN

Stack Overflow用户
提问于 2014-11-13 17:49:01
回答 2查看 5.3K关注 0票数 3

我试图使用sqltransaction和executescalar对数据库进行两个插入,以返回第一个insert的输出ID。

这是代码:

代码语言:javascript
复制
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,那么一切都很好。

有什么想法吗?

EN

回答 2

Stack Overflow用户

发布于 2014-11-13 17:55:42

你错过了很多事情

  1. 实施交易
  2. 回滚事务

事务将在任何错误时回滚,或者如果未首先提交而被释放,则回滚事务。

试试看:

代码语言:javascript
复制
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());
     }
票数 1
EN

Stack Overflow用户

发布于 2014-11-13 19:01:02

我希望您展示一些SQL,这样我们就可以看到您在做什么,但是我必须假设您有一个身份列,您将从其中获得新的id。我喜欢避免多次访问服务器,这样您就可以清楚地知道,通过将多个SQL语句与";“分隔开来,您可以在一个调用中组合多个SQL语句。该单次调用中的所有语句都是事务性的,因此您的总体代码将更小,而且访问服务器的次数也会减少,速度也会更快。IE:

代码语言:javascript
复制
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();

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26915171

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档