使用三层开发时,两个连续的添加,如果第二个出现错误,如何使第一个回滚呢?

时间:2022-11-29 11:25:27

使用三层开发时,两个连续的添加,如果第二个出现错误,如何使第一个回滚呢?
mainFeeDAL1.Add(mianFee1);//如果这条命令成功添加

chuandaiFeeDAL1.Add(chuandaiFee1);//但是这条命令出现了错误

如何使第一条回滚呢?


21 个解决方案

#1


第二次添加与第二次添加纳入同一事务.

#2


1.
  把2个sql写在一个事务里面

2.
  第2条出错就把第一条记录删除。。呵呵

#3


开启事务  

#4


具体代码呢

#5


你可以写成Sql的存储过程啊
在其中用Sql的事物

#6


事务               回复内容太短了! 

#7


两个操作添加到同一个事务。。再提交,这样,只有全部正确执行了才会提交成功

#8


两种方式:

1.使用存储过程,在里面使用事务。
2.使用ADO.net事务处理机制。

#9



事务处理,

三层的话,在BLL层开启事物进行处理。

简单点话,用存储过程里的事务吧

#10


这个似乎稍难点,在存储过程中做好点

#11


用事务啊。

#12


无非是事务二字。


try
   {
    cmd.CommandText = "";//插入信息1
    cmd.ExecuteNonQuery();
    cmd.CommandText = "";//插入信息2
    cmd.ExecuteNonQuery();
    tran.Commit();
    MessageBox.Show("事务提交成功!");
   }
   catch(Exception ex)
   {
    tran.Rollback();
    MessageBox.Show("Error!"+ex.Message);
   }    
  }

#13


引用 12 楼 wiki14 的回复:
无非是事务二字。
C# code
try
   {
    cmd.CommandText = "";//插入信息1
    cmd.ExecuteNonQuery();
    cmd.CommandText = "";//插入信息2
    cmd.ExecuteNonQuery();
    tran.Commit();//最后提交!
    MessageBox.Show(……

up up 

#14


事务  事务事务

#15


加入事务、错了自己回滚。

#16


单条的我的知道如何做

问题是三层开发中 业务逻辑层 需要同时对多个表进行插入

应该如何进行事物的操作呢 

#17


反正大家都那样说了
我也吼一句..
事务..

#18


引用 16 楼 cehcueu 的回复:
单条的我的知道如何做

问题是三层开发中 业务逻辑层 需要同时对多个表进行插入

应该如何进行事物的操作呢

DAL层 调用存储过程

#19


//建议增加一个事务层,并从现有DAL层增加若干方法,返回SqlList
public bool ExecuteCommand(ArrayList SqlList)
        {
            DbConnection con = CreateConnection();
            con.Open();
            bool iserror = false;
            string strerror = "";
            DbTransaction SqlTran = con.BeginTransaction();
            try
            {
                for (int i = 0; i < SqlList.Count; i++)
                {

                    DbCommand _command = GetDbProviderFactory().CreateCommand();
                    _command.Connection = con;
                    _command.CommandTimeout = 500;
                    _command.CommandText = SqlList[i].ToString();
                    _command.Transaction = SqlTran;
                    _command.ExecuteNonQuery();
                    _command.Dispose();
                }

            }
            catch (Exception ex)
            {
                iserror = true;
                strerror = ex.Message;

            }
            finally
            {

                if (iserror)
                {
                    SqlTran.Rollback();
                    throw new Exception(strerror);
                }
                else
                {
                    SqlTran.Commit();
                }
                con.Close();
            }
            if (iserror)
            {
                return false;
            }
            else
            {
                return true;
            }
        }

        public int ExecuteCommand(ArrayList SqlList, List<System.Data.Common.DbParameter[]> paramlist)
        {
            DbConnection con = CreateConnection();
            con.Open();
            bool iserror = false;
            string strerror = "";
            int count = 0;
            DbTransaction SqlTran = con.BeginTransaction();
            string s = "";
            try
            {
                for (int i = 0; i < SqlList.Count; i++)
                {
                    DbCommand _command = GetDbProviderFactory().CreateCommand();
                    _command.Connection = con;
                    _command.CommandTimeout = 500;
                    _command.CommandText = SqlList[i].ToString();
                    s = SqlList[i].ToString();
                    for (int n = 0; n < paramlist[i].Length; n++)
                    {
                        DbParameter p = paramlist[i][n];
                        if (p.Value == null || p.Value.ToString() == "")
                        {
                            p.Value = DBNull.Value;
                        }
                        _command.Parameters.Add(p);
                    }
                    _command.Transaction = SqlTran;
                    count += _command.ExecuteNonQuery();
                    _command.Dispose();
                }

            }
            catch (Exception ex)
            {
                iserror = true;
                strerror = ex.Message;
                count = 0;
            }
            finally
            {

                if (iserror)
                {
                    SqlTran.Rollback();
                    throw new Exception(strerror);
                }
                else
                {
                    SqlTran.Commit();
                }
                con.Close();
            }
            return count;
        }

#20


路过,瞧瞧...

#21


事务~  学习了

#1


第二次添加与第二次添加纳入同一事务.

#2


1.
  把2个sql写在一个事务里面

2.
  第2条出错就把第一条记录删除。。呵呵

#3


开启事务  

#4


具体代码呢

#5


你可以写成Sql的存储过程啊
在其中用Sql的事物

#6


事务               回复内容太短了! 

#7


两个操作添加到同一个事务。。再提交,这样,只有全部正确执行了才会提交成功

#8


两种方式:

1.使用存储过程,在里面使用事务。
2.使用ADO.net事务处理机制。

#9



事务处理,

三层的话,在BLL层开启事物进行处理。

简单点话,用存储过程里的事务吧

#10


这个似乎稍难点,在存储过程中做好点

#11


用事务啊。

#12


无非是事务二字。


try
   {
    cmd.CommandText = "";//插入信息1
    cmd.ExecuteNonQuery();
    cmd.CommandText = "";//插入信息2
    cmd.ExecuteNonQuery();
    tran.Commit();
    MessageBox.Show("事务提交成功!");
   }
   catch(Exception ex)
   {
    tran.Rollback();
    MessageBox.Show("Error!"+ex.Message);
   }    
  }

#13


引用 12 楼 wiki14 的回复:
无非是事务二字。
C# code
try
   {
    cmd.CommandText = "";//插入信息1
    cmd.ExecuteNonQuery();
    cmd.CommandText = "";//插入信息2
    cmd.ExecuteNonQuery();
    tran.Commit();//最后提交!
    MessageBox.Show(……

up up 

#14


事务  事务事务

#15


加入事务、错了自己回滚。

#16


单条的我的知道如何做

问题是三层开发中 业务逻辑层 需要同时对多个表进行插入

应该如何进行事物的操作呢 

#17


反正大家都那样说了
我也吼一句..
事务..

#18


引用 16 楼 cehcueu 的回复:
单条的我的知道如何做

问题是三层开发中 业务逻辑层 需要同时对多个表进行插入

应该如何进行事物的操作呢

DAL层 调用存储过程

#19


//建议增加一个事务层,并从现有DAL层增加若干方法,返回SqlList
public bool ExecuteCommand(ArrayList SqlList)
        {
            DbConnection con = CreateConnection();
            con.Open();
            bool iserror = false;
            string strerror = "";
            DbTransaction SqlTran = con.BeginTransaction();
            try
            {
                for (int i = 0; i < SqlList.Count; i++)
                {

                    DbCommand _command = GetDbProviderFactory().CreateCommand();
                    _command.Connection = con;
                    _command.CommandTimeout = 500;
                    _command.CommandText = SqlList[i].ToString();
                    _command.Transaction = SqlTran;
                    _command.ExecuteNonQuery();
                    _command.Dispose();
                }

            }
            catch (Exception ex)
            {
                iserror = true;
                strerror = ex.Message;

            }
            finally
            {

                if (iserror)
                {
                    SqlTran.Rollback();
                    throw new Exception(strerror);
                }
                else
                {
                    SqlTran.Commit();
                }
                con.Close();
            }
            if (iserror)
            {
                return false;
            }
            else
            {
                return true;
            }
        }

        public int ExecuteCommand(ArrayList SqlList, List<System.Data.Common.DbParameter[]> paramlist)
        {
            DbConnection con = CreateConnection();
            con.Open();
            bool iserror = false;
            string strerror = "";
            int count = 0;
            DbTransaction SqlTran = con.BeginTransaction();
            string s = "";
            try
            {
                for (int i = 0; i < SqlList.Count; i++)
                {
                    DbCommand _command = GetDbProviderFactory().CreateCommand();
                    _command.Connection = con;
                    _command.CommandTimeout = 500;
                    _command.CommandText = SqlList[i].ToString();
                    s = SqlList[i].ToString();
                    for (int n = 0; n < paramlist[i].Length; n++)
                    {
                        DbParameter p = paramlist[i][n];
                        if (p.Value == null || p.Value.ToString() == "")
                        {
                            p.Value = DBNull.Value;
                        }
                        _command.Parameters.Add(p);
                    }
                    _command.Transaction = SqlTran;
                    count += _command.ExecuteNonQuery();
                    _command.Dispose();
                }

            }
            catch (Exception ex)
            {
                iserror = true;
                strerror = ex.Message;
                count = 0;
            }
            finally
            {

                if (iserror)
                {
                    SqlTran.Rollback();
                    throw new Exception(strerror);
                }
                else
                {
                    SqlTran.Commit();
                }
                con.Close();
            }
            return count;
        }

#20


路过,瞧瞧...

#21


事务~  学习了