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的时候我看数据库没有数据?
Transaction 得放到
for (int i = 0; i < Parameter.Count; i++)
{
flag[i] = Commit.Commit.executeTransaction(sql[i], (SqlParameter[])Parameter[i]);
}
之外,也就是说你所有执行查询的语句要使用同一个 Transaction 对象。
恩 我明白了你的意思 但是我这些写还是不行
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: 你一 BeginTransaction() 就又是一个新的 Transaction了,然后你还把你的全局变量给覆盖了。你看下这篇文章:http://blog.csdn.net/kntao/article/details/5729011
@程序猿.码农: 他这不涉及到2次提交的问题
@s_p: 只有在 Transaction.Commit() 的时候才会知道数据库操作失败,还是成功。按照你的逻辑,你需要为每个插入都新建一个 Transaction,然后把 Transaction 都保存到一个数组里,当你为数组里的每个 Transaction 执行 Commit 的时候,如果失败,则需要把数组里所有的 Transaction 都执行 Rollback.
你可以先说明你的需求,因为我觉得你把事务的概念理解错了,没能正确的使用。
@程序猿.码农: 我的意思就是 我有4条语句 我给他们执行事物但是不提交 等他们的4次结果都是true 我就提交
@s_p: 你如果使用了事务,不提交,那么这些执行就不能知道是成功还是失败,实际上也没有真正插入数据库,只有在commit后才提交更新,才能知道是否成功。
@s_p: 也就是说你需要对每条语句生成一个事务对象,然后把它们用数组保存起来,然后循环执行该数组里的每个事务对象的Commit方法,如果有一条出错,则对该数组内所有事务对象执行Rollback。你可以采用命令模式来封装这一实现。
当语句较多时,你会因为HANDLE了太多的事务而大幅度降低性能,但是我描述的方式的确能按照你的设计意图来正确执行。
@程序猿.码农: 个人觉得你的设计意图属于过度设计,在数据库提交上,并不需要如此,你可以再仔细的考虑下你的业务需求,你到底想实现一个什么样的业务场景?
@程序猿.码农: 我有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: 我发现网上批量更新的操作好少 我现在的是 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: 说实话,我不太理解,我猜你是不是想这样:
executeTransaction(string[] commands,SqlParameter[][] args);
@程序猿.码农: 就是批量的操作
@s_p: 恩
@s_p: 谢谢 大侠 我解决了 这个问题