在foreach循环中插入列表时如何处理事务

计算机辅助设计

我的DAL中有此方法,该方法将列表中的所有对象插入到foreach循环中的表中。但是问题是以这种方式处理事务:如果无法插入列表中的任何项目,则应回滚整个过程。有什么方法可以解决这个问题,还是必须更改方法?

public bool InsertEarnings(List<Earning> earningsList)
{
    using (SqlConnection sqlConnection = new SqlConnection(db.GetConnectionString))
    {
        string insertStatement = "IF NOT EXISTS (SELECT * FROM SalaryTrans WHERE employee_id=@employee_id) " +
        "BEGIN INSERT INTO salaryTrans... " + 
        "ELSE BEGIN UPDATE SalaryTrans SET" ;

        using (SqlCommand sqlCommand = new SqlCommand(insertStatement, sqlConnection))
        {
            SqlParameter paramEmployeeID = new SqlParameter("@employee_id", SqlDbType.Char);
            SqlParameter paramWorDays = new SqlParameter("@work_days", SqlDbType.Int);
            //


            sqlCommand.Parameters.Add(paramEmployeeID);
            sqlCommand.Parameters.Add(paramWorDays);
            //

            sqlConnection.Open();                    

            foreach (Earning earning in earningsList)
            {
                paramEmployeeID.Value = earning.EmployeeID;
                paramWorDays.Value = earning.WorkDays;
                //

                sqlCommand.ExecuteNonQuery();
            }
            return true;
        }
    }
}
玻璃钢

看这个示例,在表中检查所有字段nvarchar(50)IdCoche是PrimaryKey,表为空

  private void button1_Click(object sender, EventArgs e)
    {
        //Reading conection from App Settings
        //this insert values from 20 to 29
        ExecuteSqlTransaction(Settings.Default.Conexion,20);
        //this must insert values from 15 to 24
        //But at 20 a PrimaryKey infraction raise exception and rollback
        ExecuteSqlTransaction(Settings.Default.Conexion, 15);

    }
private static void ExecuteSqlTransaction(string connectionString,int start)
{
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        connection.Open();

        SqlCommand command = connection.CreateCommand();
        SqlTransaction transaction;
        transaction = connection.BeginTransaction("SampleTransaction");
        // Must assign both transaction object and connection 
        // to Command object for a pending local transaction
        command.Connection = connection;
        command.Transaction = transaction;
        command.CommandText = "INSERT INTO [dbo].[Coches] ([IdCoche],[Marca],[Modelo],[Version]) VALUES (@IdCoche,@Marca,@Modelo,@Version)";
        command.Parameters.AddRange(new SqlParameter[]{
                new SqlParameter("@IdCoche",""),
                new SqlParameter("@Marca",""),
                new SqlParameter("@Modelo",""),
                new SqlParameter("@Version","")
            });
        try
        {
            for (int i = start; i < start + 10; i++)
            {
                command.Parameters["@IdCoche"].Value = "IdCoche"+i.ToString();
                command.Parameters["@Marca"].Value = "Marca" + i.ToString(); ;
                command.Parameters["@Modelo"].Value = "Modelo" + i.ToString(); ;
                command.Parameters["@Version"].Value = "Version" + i.ToString(); ;
                command.ExecuteNonQuery();
            }

            // Attempt to commit the transaction.
            transaction.Commit();
            Console.WriteLine("10 records are written to database.");
        }
        catch (Exception ex)
        {
            Console.WriteLine("Commit Exception Type: {0}", ex.GetType());
            Console.WriteLine("  Message: {0}", ex.Message);

            // Attempt to roll back the transaction. 
            try
            {
                transaction.Rollback();
            }
            catch (Exception ex2)
            {
                // This catch block will handle any errors that may have occurred 
                // on the server that would cause the rollback to fail, such as 
                // a closed connection.
                Console.WriteLine("Rollback Exception Type: {0}", ex2.GetType());
                Console.WriteLine("  Message: {0}", ex2.Message);
            }
        }
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在foreach循环中插入列表时如何处理事务

来自分类Dev

在C#循环中调用SQL存储过程时处理事务

来自分类Dev

使用容器管理事务时如何处理异常

来自分类Dev

SQL适配器可以处理事务(开始/插入/回滚)吗?

来自分类Dev

错误:返回的错误:处理事务时VM异常:使用New创建时还原

来自分类Dev

如何在Java EE环境中使用JMS和JPA处理事务回滚?

来自分类Dev

如何在Fabric8中处理事务日志?

来自分类Dev

Titan Graph DB:在IdGraph中处理事务

来自分类Dev

手动处理事务而不是JtaTransactionManager

来自分类Dev

Qt如何处理事件发出的无限循环?

来自分类Dev

在DBI下使用批处理事务DELETE进行InnoDB锁定穷举

来自分类Dev

在ViewPager中处理事务后,ListFragment显示空白屏幕

来自分类Dev

骆驼异常/错误处理事务路由而不会导致客户端异常

来自分类Dev

Firebase RTDB 批处理事务(同时增加 2 个值)

来自分类Dev

如何处理while循环中的删除

来自分类Dev

在循环C#时插入列表时如何提高性能

来自分类Dev

forEach 循环中的 Sequelize 事务

来自分类Dev

如何处理主游戏循环中的按键事件?

来自分类Dev

如何处理for循环中的错误(python)并继续执行

来自分类Dev

如何处理循环中调用的异步函数?

来自分类Dev

如何处理在循环中创建的视图上的UITapGestureRecognizer?

来自分类Dev

函数while循环中的返回如何处理?

来自分类Dev

如何处理主游戏循环中的按键事件?

来自分类Dev

如何处理for循环中的promise进行递归

来自分类Dev

Flink 如何处理迭代循环中的时间戳?

来自分类Dev

使用多种数据类型时,如何处理多个foreach循环

来自分类Dev

Foreach循环中的实体框架事务

来自分类Dev

如何处理事件处理程序引发的域事件?

来自分类Dev

如何处理来自循环列表的列表?

Related 相关文章

  1. 1

    在foreach循环中插入列表时如何处理事务

  2. 2

    在C#循环中调用SQL存储过程时处理事务

  3. 3

    使用容器管理事务时如何处理异常

  4. 4

    SQL适配器可以处理事务(开始/插入/回滚)吗?

  5. 5

    错误:返回的错误:处理事务时VM异常:使用New创建时还原

  6. 6

    如何在Java EE环境中使用JMS和JPA处理事务回滚?

  7. 7

    如何在Fabric8中处理事务日志?

  8. 8

    Titan Graph DB:在IdGraph中处理事务

  9. 9

    手动处理事务而不是JtaTransactionManager

  10. 10

    Qt如何处理事件发出的无限循环?

  11. 11

    在DBI下使用批处理事务DELETE进行InnoDB锁定穷举

  12. 12

    在ViewPager中处理事务后,ListFragment显示空白屏幕

  13. 13

    骆驼异常/错误处理事务路由而不会导致客户端异常

  14. 14

    Firebase RTDB 批处理事务(同时增加 2 个值)

  15. 15

    如何处理while循环中的删除

  16. 16

    在循环C#时插入列表时如何提高性能

  17. 17

    forEach 循环中的 Sequelize 事务

  18. 18

    如何处理主游戏循环中的按键事件?

  19. 19

    如何处理for循环中的错误(python)并继续执行

  20. 20

    如何处理循环中调用的异步函数?

  21. 21

    如何处理在循环中创建的视图上的UITapGestureRecognizer?

  22. 22

    函数while循环中的返回如何处理?

  23. 23

    如何处理主游戏循环中的按键事件?

  24. 24

    如何处理for循环中的promise进行递归

  25. 25

    Flink 如何处理迭代循环中的时间戳?

  26. 26

    使用多种数据类型时,如何处理多个foreach循环

  27. 27

    Foreach循环中的实体框架事务

  28. 28

    如何处理事件处理程序引发的域事件?

  29. 29

    如何处理来自循环列表的列表?

热门标签

归档