首页 新闻 会员 周边 捐助

net事物提交的问题 大侠们过来看看 急??

0
悬赏园豆:30 [已解决问题] 解决于 2012-08-07 20:09
 for (int i = 0; i < Parameter.Count; i++)
            {
                flag[i] = Commit.Commit.executeTransaction(sql[i], (SqlParameter[])Parameter[i]);
            }
  public static bool executeTransaction(string strSql, SqlParameter[] values)
        {
            bool flag = false;
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = _con;//命令对象  
            SqlTransaction myTransaction;//声明一个SQL事物类型  
            myTransaction = con.BeginTransaction();//基于一个连接初始化事物  
            try
            {
                cmd.Transaction = myTransaction;//指定SQL命令语句 的事物  
                cmd.CommandText = strSql;//给定命令语句  
                if (values!= null)
                {
                    foreach (SqlParameter parameter in values)
                    {
                        if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) &&(parameter.Value == null))
                        {
                            parameter.Value = DBNull.Value;
                        }
                        cmd.Parameters.Add(parameter);
                    }
                    cmd.ExecuteNonQuery();//执行SQL语句  
                }
                flag = true;
            }
            catch (Exception ex)
            {
                flag = false;
                throw ex;
            }
            finally
            {
                _con.Close();
            }
            return flag;
        }

我先得到所有的sql语句执行的true 和false

当全部是true的时候提交

代码:

Commit.Commit.executeTransaction(flag);

我这样写代码行吗?

  public static bool executeTransaction(bool[] flag)
        {
            int i = 0;
            bool sp = false;
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = _con;//命令对象  
            SqlTransaction myTransaction;//声明一个SQL事物类型  
            myTransaction = con.BeginTransaction();//基于一个连接初始化事物  
            try
            {
                foreach (bool item in flag)
                {
                    if (item == true)
                    {
                        i++;
                    }
                    else
                    {
                        i--;
                    }
                }
                if (i == 4)
                {
                    sp = true;
                    myTransaction.Commit();
                }
                else
                {
                    myTransaction.Rollback();
                }
            }
            catch (Exception ex)
            {
                sp = false;
                throw ex;
            }
            finally
            {
                _con.Close();
            }
            return sp;
        }

我只要flag里面全部是 true就提交 不要执行什么语句?但是当全部是true的时候我看数据库没有数据?
s_p的主页 s_p | 初学一级 | 园豆:140
提问于:2012-08-07 15:50
< >
分享
最佳答案
0

Transaction 得放到

for (int i = 0; i < Parameter.Count; i++)
            {
                flag[i]
= Commit.Commit.executeTransaction(sql[i], (SqlParameter[])Parameter[i]);
            }

之外,也就是说你所有执行查询的语句要使用同一个 Transaction 对象。

收获园豆:30
Launcher | 高人七级 |园豆:45050 | 2012-08-07 15:55

恩  我明白了你的意思 但是我这些写还是不行

 public static SqlTransaction myTransaction_sp;//声明一个SQL事物类型  
        //定义批量执行多条SQL语句的方法  
        public static bool executeTransaction(string strSql, SqlParameter[] values)
        {
            bool flag = false;
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = _con;//命令对象  
            myTransaction_sp = con.BeginTransaction();//基于一个连接初始化事物  
            try
            {
                cmd.Transaction = myTransaction_sp;//指定SQL命令语句 的事物  
                cmd.CommandText = strSql;//给定命令语句  
                if (values!= null)
                {
                    foreach (SqlParameter parameter in values)
                    {
                        if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) &&(parameter.Value == null))
                        {
                            parameter.Value = DBNull.Value;
                        }
                        cmd.Parameters.Add(parameter);
                    }
                    cmd.ExecuteNonQuery();//执行SQL语句  
                }
                flag = true;
            }
            catch (Exception ex)
            {
                flag = false;
                throw ex;
            }
            finally
            {
                _con.Close();
            }
            return flag;
        }

        public static bool executeTransaction(bool[] flag)
        {
            int i = 0;
            bool sp = false;
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = _con;//命令对象  
            myTransaction_sp = con.BeginTransaction();//基于一个连接初始化事物  
            try
            {
                foreach (bool item in flag)
                {
                    if (item == true)
                    {
                        i++;
                    }
                    else
                    {
                        i--;
                    }
                }
                if (i == 4)
                {
                    sp = true;
                    myTransaction_sp.Commit();
                }
                else
                {
                    myTransaction_sp.Rollback();
                }
            }
            catch (Exception ex)
            {
                sp = false;
                throw ex;
            }
            finally
            {
                _con.Close();
            }
            return sp;
        }

我定义了一个Transaction 全局的  也是使用同一个 怎么就???

s_p | 园豆:140 (初学一级) | 2012-08-07 16:03

@s_p: 你一 BeginTransaction() 就又是一个新的 Transaction了,然后你还把你的全局变量给覆盖了。你看下这篇文章:http://blog.csdn.net/kntao/article/details/5729011

Launcher | 园豆:45050 (高人七级) | 2012-08-07 16:13

@程序猿.码农: 他这不涉及到2次提交的问题

s_p | 园豆:140 (初学一级) | 2012-08-07 16:19

@s_p: 只有在 Transaction.Commit() 的时候才会知道数据库操作失败,还是成功。按照你的逻辑,你需要为每个插入都新建一个 Transaction,然后把 Transaction 都保存到一个数组里,当你为数组里的每个 Transaction 执行 Commit 的时候,如果失败,则需要把数组里所有的 Transaction 都执行 Rollback.

你可以先说明你的需求,因为我觉得你把事务的概念理解错了,没能正确的使用。

Launcher | 园豆:45050 (高人七级) | 2012-08-07 16:48

@程序猿.码农: 我的意思就是 我有4条语句 我给他们执行事物但是不提交 等他们的4次结果都是true 我就提交

s_p | 园豆:140 (初学一级) | 2012-08-07 17:00

@s_p: 你如果使用了事务,不提交,那么这些执行就不能知道是成功还是失败,实际上也没有真正插入数据库,只有在commit后才提交更新,才能知道是否成功。

Launcher | 园豆:45050 (高人七级) | 2012-08-07 17:06

@s_p: 也就是说你需要对每条语句生成一个事务对象,然后把它们用数组保存起来,然后循环执行该数组里的每个事务对象的Commit方法,如果有一条出错,则对该数组内所有事务对象执行Rollback。你可以采用命令模式来封装这一实现。

当语句较多时,你会因为HANDLE了太多的事务而大幅度降低性能,但是我描述的方式的确能按照你的设计意图来正确执行。

Launcher | 园豆:45050 (高人七级) | 2012-08-07 17:13

@程序猿.码农: 个人觉得你的设计意图属于过度设计,在数据库提交上,并不需要如此,你可以再仔细的考虑下你的业务需求,你到底想实现一个什么样的业务场景?

Launcher | 园豆:45050 (高人七级) | 2012-08-07 17:15

@程序猿.码农: 我有4条这样的语句

str.Append(@"insert into  A_MDTInfo(TerminalID,MDTCompany,MDTType,ProtocolVer)
                                         values(@TerminalID,@MDTCompany,@MDTType,@ProtocolVer ");
            str.Append(" )");

            SqlParameter[] spr3 = new SqlParameter[]{
                                                    new SqlParameter("@TerminalID",SqlDbType.VarChar,50),
                                                    new SqlParameter("@MDTCompany",SqlDbType.VarChar,10),
                                                    new SqlParameter("@MDTType",SqlDbType.VarChar,50),
                                                    new SqlParameter("@ProtocolVer",SqlDbType.VarChar,50)
                                                    };
            spr3[0].Value = MDTInfoModel.A_TerminalID;
            spr3[1].Value = MDTInfoModel.A_MDTCompany;
            spr3[2].Value = MDTInfoModel.A_MDTType;
            spr3[3].Value = MDTInfoModel.A_ProtocolVer;
            #endregion
            sql[2] = str.ToString();
            str.Clear();

Commit.Commit.executeTransaction(sql, ??);这个SqlParameter也有4个 其中sql是个数组

  string[] sql = new string[4];

s_p | 园豆:140 (初学一级) | 2012-08-07 17:33

@s_p: 我发现网上批量更新的操作好少 我现在的是 insert 和update (不是select delete )而且参数是用 SqlParameter[] spr3 = new SqlParameter[]{......} 这样就个问题 我怎么把它带过去 解析 我用数组

Array Parameter = new Array[spr,spr2,spr3,spr4];
             
            flag = Commit.Commit.executeTransaction(sql, Parameter);

可以我不知怎么来解析这个 Parameter 并且 Array Parameter = new Array[spr,spr2,spr3,spr4];这个还提示 错误    9    无法将类型“System.Data.SqlClient.SqlParameter[]”隐式转换为“int”    F:\lsw\WC_DBConsole\WC_DBConsole\Models\DaoInterface\DaoCustomerInfoModel.cs    390


s_p | 园豆:140 (初学一级) | 2012-08-07 17:37

@s_p: 说实话,我不太理解,我猜你是不是想这样:

executeTransaction(string[] commands,SqlParameter[][] args);

Launcher | 园豆:45050 (高人七级) | 2012-08-07 17:42

@程序猿.码农: 就是批量的操作

s_p | 园豆:140 (初学一级) | 2012-08-07 17:47

@s_p: 恩

s_p | 园豆:140 (初学一级) | 2012-08-07 17:48

@s_p: 谢谢 大侠 我解决了 这个问题

s_p | 园豆:140 (初学一级) | 2012-08-07 20:09
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册