第一、sql中写事物
begin try
begin transaction
insert into shiwu (asd) values ('aasdasda');
commit transaction
end try
begin catch
select ERROR_NUMBER() as errornumber
rollback transaction
end catch
第二、c#中执行事物
SqlParameter[] paras = new SqlParameter[] { }; paras = list.ToArray(); Baitour.Utility.DBHelper db = Baitour.Utility.DBHelper.CreateMapping(); DbTransaction dbTran = db.CreateTran(); try { //在这里将插入得到的子订单号返回 object obj = db.ExecuteScalar(sql.ToString(), paras, dbTran); fsId = obj.ToString(); //int index = db.ExecuteNonQuery(sql.ToString(), paras, dbTran); if (!string.IsNullOrWhiteSpace(fsId)) { dbTran.Commit(); flag = true; } } catch (Exception ex) { flag = false; dbTran.Rollback(); //throw; } finally { db.CloseConn(); }
dbHelper
using System; using System.Collections.Specialized; using System.Configuration; using System.Data; using System.Data.Common; using System.Data.SqlClient; using Microsoft.Practices.EnterpriseLibrary.Data; using Microsoft.Practices.EnterpriseLibrary.Data.Sql; /* * 作 者: zjf * 创建时间: 2013-1-29 10:20:53 * 说明: */ namespace Baitour.Utility { /// <summary> /// 数据库访问类 /// </summary> public sealed class DBHelper { public static int ConnIndex = 0; public static DBHelper CreateMapping(string connStr = "") { DBHelper db = new DBHelper(connStr); return db; } /// <summary> /// 增删改的数据库连接字符串 /// </summary> string conString = ""; /// <summary> /// 查询的数据库连接字符串 /// </summary> string queryConString = ""; DBHelper(string connStr = "") { if (string.IsNullOrWhiteSpace(connStr)) { conString = ConfigurationManager.ConnectionStrings["DBConfig"].ToString(); //第一个链接字符串是ConfigurationManager.ConnectionStrings[0].Name LocalSqlServer不知道是谁,所以要从第二个取 //如果连接字符串的数量和当前索引+1相同 则从第一个索引开始取 NameValueCollection connStrs = new NameValueCollection(); int j = 0; for (int i = 0; i < ConfigurationManager.ConnectionStrings.Count; i++) { if (ConfigurationManager.ConnectionStrings[i].Name.StartsWith("QueryDB")) { connStrs.Add(j.ToString(), ConfigurationManager.ConnectionStrings[i].ToString()); j++; } } if (connStrs.Count > 0) { if (connStrs.Count == ConnIndex) { ConnIndex = 0; } queryConString = connStrs[ConnIndex].ToString(); ConnIndex++; } else { queryConString = conString; } } else { conString = connStr; queryConString = connStr; } DBMapping = new SqlDatabase(conString); QueryDBMapping = new SqlDatabase(queryConString); } #region 变量or属性 /// <summary> /// 增删改的企业库访问映射对象 /// </summary> internal Database DBMapping { get; set; } /// <summary> /// 查询的企业库访问映射对象 /// </summary> internal Database QueryDBMapping { get; set; } /// <summary> /// 增删改的数据库连接 /// </summary> internal DbConnection DBConnMapping { get; set; } /// <summary> /// 查询的数据库连接 /// </summary> internal DbConnection QueryDBConnMapping { get; set; } /// <summary> /// 数据库事务 /// </summary> internal DbTransaction DBTranMapping { get; set; } #endregion #region 方法 #region 准备方法 /// <summary> /// 创建数据库连接 /// </summary> void CreateDB() { DBMapping = new SqlDatabase(conString); QueryDBMapping = new SqlDatabase(queryConString); } /// <summary> /// 创建并打开连接 /// </summary> void CreateConn() { #region 增删改 if (DBMapping == null) { CreateDB(); } if (DBConnMapping == null) { DBConnMapping = DBMapping.CreateConnection(); DBConnMapping.Open();//打开连接 } //打开存在的连接 if (DBConnMapping != null && DBConnMapping.State != ConnectionState.Open) { DBConnMapping.Open();//打开连接 } #endregion #region 查询 if (QueryDBMapping == null) { CreateDB(); } if (QueryDBConnMapping == null) { QueryDBConnMapping = QueryDBMapping.CreateConnection(); QueryDBConnMapping.Open();//打开连接 } //打开存在的连接 if (QueryDBConnMapping != null && QueryDBConnMapping.State != ConnectionState.Open) { QueryDBConnMapping.Open();//打开连接 } #endregion } /// <summary> /// 关闭数据库连接 /// </summary> public void CloseConn() { if (DBConnMapping != null && DBConnMapping.State == ConnectionState.Open) { DBConnMapping.Close(); DBConnMapping.Dispose(); } if (QueryDBConnMapping != null && QueryDBConnMapping.State == ConnectionState.Open) { QueryDBConnMapping.Close(); QueryDBConnMapping.Dispose(); } } /// <summary> /// 创建并返回事务 /// </summary> public DbTransaction CreateTran() { if (DBMapping == null) { CreateDB(); } CreateConn(); DBTranMapping = DBTranMapping ?? DBConnMapping.BeginTransaction(); return DBTranMapping; } /// <summary> /// 创建命令对象 /// </summary> /// <param name="commandType">sql语句/存储过程</param> /// <param name="commandText">名称</param> /// <param name="commParameters">sql参数</param> /// <param name="isQuery">是否是创建查询命令</param> /// <returns></returns> DbCommand CreateComm(CommandType commandType, string commandText, DbParameter[] commParameters = null, bool isQuery = false) { DbCommand command = null; if (commandText == null || commandText.Length == 0) throw new ArgumentNullException("sql语句/存储过程为空"); //创建命令对象 if (commandType == CommandType.StoredProcedure) command = isQuery ? QueryDBMapping.GetStoredProcCommand(commandText) : DBMapping.GetStoredProcCommand(commandText); else command = isQuery ? QueryDBMapping.GetSqlStringCommand(commandText) : DBMapping.GetSqlStringCommand(commandText); //清空参数 command.Parameters.Clear(); //填充参数 if (commParameters != null) { if (!string.IsNullOrWhiteSpace(ConfigurationManager.AppSettings["DBType"]) && ConfigurationManager.AppSettings["DBType"].ToLower() == "oracle") { foreach (DbParameter item in commParameters) { if (!item.ParameterName.StartsWith("!")) item.ParameterName = "!" + item.ParameterName; } } else { foreach (DbParameter item in commParameters) { if (!item.ParameterName.StartsWith("@")) item.ParameterName = "@" + item.ParameterName; } } if (commParameters.Length == 1) { command.Parameters.Add(commParameters[0]); } else { command.Parameters.AddRange(commParameters); } } return command; } #endregion #region 执行方法 #region sql、存储过程 /// <summary> /// 返回首列 /// </summary> /// <param name="sql"></param> /// <param name="paras"></param> /// <returns></returns> public object ExecuteScalar(string sql, DbParameter[] paras, CommandType cType = CommandType.Text) { object obj = null; try { DbCommand command = CreateComm(cType, sql, paras, true); obj = DBMapping.ExecuteScalar(command); } catch (Exception ex) { } finally { CloseConn(); } return obj; } /// <summary> /// 返回首列 /// </summary> /// <param name="sql"></param> /// <param name="paras"></param> /// <returns></returns> public object ExecuteScalar(string sql, DbParameter[] paras, DbTransaction tran, CommandType cType = CommandType.Text) { object obj = null; try { DbCommand command = CreateComm(cType, sql, paras); obj = DBMapping.ExecuteScalar(command, tran); } catch (Exception ex) { } finally { } return obj; } /// <summary> /// 返回reader /// </summary> /// <param name="sql"></param> /// <param name="paras"></param> /// <returns></returns> public IDataReader ExecuteReader(string sql, DbParameter[] paras, CommandType cType = CommandType.Text) { try { DbCommand command = CreateComm(cType, sql, paras, true); command.Connection = QueryDBMapping.CreateConnection(); command.Connection.Open(); return command.ExecuteReader(CommandBehavior.CloseConnection); } catch (Exception ex) { return null; } } /// <summary> /// 返回数据集 /// </summary> /// <returns></returns> public DataSet ExecuteDataSet(string sql, DbParameter[] paras, CommandType cType = CommandType.Text) { try { DbCommand command = CreateComm(cType, sql, paras, true); return QueryDBMapping.ExecuteDataSet(command); } catch (Exception ex) { return null; } finally { CloseConn(); } } public DataSet ExecuteDataSet(string sql) { try { DbCommand db = CreateComm(CommandType.Text, sql); return QueryDBMapping.ExecuteDataSet(CommandType.Text,sql); } catch { return null; } finally { CloseConn(); } } /// <summary> /// 得到影响行数 /// </summary> /// <returns></returns> public int ExecuteNonQuery(string sql, DbParameter[] paras, CommandType cType = CommandType.Text) { try { DbCommand command = CreateComm(cType, sql, paras); return DBMapping.ExecuteNonQuery(command); } catch (Exception ex) { return -1; } finally { CloseConn(); } } /// <summary> /// 得到影响行数需要手动关闭连接 /// </summary> /// <returns></returns> public int ExecuteNonQuery(string sql, DbParameter[] paras, DbTransaction tran, CommandType cType = CommandType.Text) { try { DbCommand command = CreateComm(cType, sql, paras); return DBMapping.ExecuteNonQuery(command, tran); } catch (Exception ex) { return -1; } finally { } } /// <summary> /// 数据库分页获取DataSet对象 /// </summary> /// <param name="sTable_Name">表名/视图名</param> /// <param name="sSign_Record">显示的字段(以,分隔)/*表示全部字段</param> /// <param name="sFilter_Condition">查询条件</param> /// <param name="iPage_Size">每页显示条数</param> /// <param name="iPage_Index">第几页</param> /// <param name="sTaxisField">排序字段(以,分隔)</param> /// <param name="iTaxis_Sign">排序0升序1降序</param> /// <param name="iPageCount">返回总页数</param> /// <param name="iiRecord_Count">返回总记录数</param> /// <returns>DataSet对象</returns> public DataSet ExecutePageDataSet(string sTable_Name, string sSign_Record, string sFilter_Condition, int iPage_Size, int iPage_Index, string sTaxisField, int iTaxis_Sign, out int iPageCount, out int iiRecord_Count) { DataSet ds = new DataSet(); try { SqlParameter[] param = new SqlParameter[] { new SqlParameter("@TableName",sTable_Name), new SqlParameter("@Fields",sSign_Record), new SqlParameter("@OrderField",sTaxisField), new SqlParameter("@Taxis_Sign",iTaxis_Sign), new SqlParameter("@sqlWhere",sFilter_Condition), new SqlParameter("@pageSize",iPage_Size), new SqlParameter("@pageIndex",iPage_Index), new SqlParameter("@TotalPage", System.Data.SqlDbType.Int), new SqlParameter("@totalCount", System.Data.SqlDbType.Int) }; param[7].Direction = System.Data.ParameterDirection.Output; param[8].Direction = System.Data.ParameterDirection.Output; //执行 DbCommand command = CreateComm(CommandType.StoredProcedure, "up_ProcCustomPage2005", param); ds = QueryDBMapping.ExecuteDataSet(command); iPageCount = 0; iiRecord_Count = 0; try { iPageCount = Convert.ToInt32(command.Parameters["@TotalPage"].Value); iiRecord_Count = Convert.ToInt32(command.Parameters["@totalCount"].Value); } catch (Exception ex) { iPageCount = 0; iiRecord_Count = 0; } finally { command.Parameters.Clear(); } } catch (Exception ex) { ds = null; iPageCount = 0; iiRecord_Count = 0; } finally { } return ds; } #endregion #region 不加上查询参数的 /// <summary> /// 返回首列 /// </summary> /// <param name="sql"></param> /// <param name="paras"></param> /// <returns></returns> public object ExecuteScalar(string sql) { object obj = null; try { DbCommand command = CreateComm(CommandType.Text, sql, null, true); return DBMapping.ExecuteScalar(command); } catch (Exception ex) { } finally { CloseConn(); } return obj; } /// <summary> /// 返回reader /// </summary> /// <returns></returns> public IDataReader ExecuteReader(string sql) { try { DbCommand command = CreateComm(CommandType.Text, sql, null, true); return QueryDBMapping.ExecuteReader(command); } catch (Exception ex) { return null; } } /// <summary> /// 得到影响行数 /// </summary> /// <returns></returns> public int ExecuteNonQuery(string sql) { try { DbCommand command = CreateComm(CommandType.Text, sql, null, true); return DBMapping.ExecuteNonQuery(command); } catch (Exception ex) { throw; } } #endregion #endregion #endregion } }