using System; using System.Collections; using System.Data; using System.Data.SqlClient; using System.Data.OleDb; using System.Data.OracleClient; using System.Xml; using System.IO; using System.Text; using System.Threading; using System.Runtime.Remoting.Lifetime; using System.Data.Common; using System.Reflection; using System.Configuration; using Core.Mes.Common; using System.Runtime.Serialization.Formatters.Binary; using System.Runtime.Serialization; namespace STMes { /// /// DBProxy 的摘要说明。 /// public class DBProxy : MarshalByRefObject, IDisposable { private static Hashtable _dataProviderNameList = Hashtable.Synchronized(new Hashtable(5)); private static Hashtable _dataProviderTypeList = Hashtable.Synchronized(new Hashtable(5)); private CoreWriteLogFile cwl = new CoreWriteLogFile(); private CoreWriteLogFile cwl_sql = new CoreWriteLogFile("SQL"); public DBProxy() { InitDBProxy(); } private bool _isLogging = false; public void SetLogging(bool _log) { _isLogging = _log; cwl_sql.StartLogging(_log); } public void InitDBProxy() { AddDataProvider(new DataProvider.SqlDataProvider()); AddDataProvider(new DataProvider.OleDbDataProvider()); AddDataProvider(new DataProvider.OdbcDataProvider()); AddDataProvider(new DataProvider.OracleDataProvider()); AddDataProvider(new DataProvider.ODPDataProvider()); Console.WriteLine("创建数据库代理DBProxy...\n"); //从数据库配置文件中读取数据库连接信息 ReadDbConnectionInfo(@"MesDB.cfg"); //预先创建所有连接... CreateAllConnections(); _connLifeTimeA = int.Parse(ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None).AppSettings.Settings["connLifeTimeA"].Value.ToString().ToLower()); _connLifeTimeB = int.Parse(ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None).AppSettings.Settings["connLifeTimeB"].Value.ToString().ToLower()); _connLifeTimeC = int.Parse(ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None).AppSettings.Settings["connLifeTimeC"].Value.ToString().ToLower()); //创建一个线程,用来定时清除已经断开连接的DBManager #region 原来代码 maliang 2011-10-19 /* _checkConnThread = new Thread(new ThreadStart(CheckConnActive)); _checkConnThread.Start(); _fixConnThread = new Thread(new ThreadStart(FixConnections)); _fixConnThread.Start(); */ #endregion #region 变更代码 maliang 2011-10-19 _ConnectionsListenerThread = new Thread(new ThreadStart(ConnectionsListener)); _ConnectionsListenerThread.Start(); #endregion _init = true; _reference++; } //没有显示调用Dispose()时调用 ~DBProxy() { Dispose(false); } #region IDisposable 成员 public void Dispose() { Dispose(true); GC.Collect(); } protected virtual void Dispose(bool disposing) { _reference--; if (disposing == true) { //释放受控资源 } //释放未受控资源 //回滚所有DBManager事务 foreach (DictionaryEntry it in _transList) { TransInfo info = (TransInfo)it.Value; IDbConnection conn = info.dbConnection; try { info.dbTransaction.Rollback(); } catch (Exception) { } if (_reference == 0) { //关闭数据库连接 foreach (DictionaryEntry it1 in _connList) { Hashtable ht1 = (Hashtable)it1.Value; foreach (DictionaryEntry it2 in ht1) { Hashtable ht2 = (Hashtable)it2.Value; foreach (DictionaryEntry it3 in ht2) { ArrayList arr = it3.Value as ArrayList; foreach (object obj in arr) { IDbConnection db = (IDbConnection)obj; db.Close(); } } } } } } // 关闭线程 try { if (_checkConnThread != null) _checkConnThread.Abort(); } catch (Exception) { } try { if (_fixConnThread != null) _fixConnThread.Abort(); } catch (Exception) { } } #endregion //返回由DBProxy为每个DBManager对象分配的ID public long GetDBManagerID() { lock (_dbManagerID) { ++_dbManagerID[0]; if (_dbManagerID[0] > 3000000) _dbManagerID[0] = 1; return _dbManagerID[0]; } } //设置DBManager对应的数据库信息 public void SetDbInfo(long dbManagerID, string dbName, string priority) { if (_dbList.Contains(dbManagerID)) { _dbList.Remove(dbManagerID); } ArrayList arr = new ArrayList(); arr.Add(dbName); arr.Add(priority); _dbList.Add(dbManagerID, arr); } //获取数据库类型,用字符串"SQLServer","Oracle", "OleDb"分别表示不同类型的数据库 public string GetDbType(string name, out string err) { err = ""; //未找到该数据库对应的配置信息 if (_dbConfigInfo.Contains(name) == false) { err = "未找到指定的数据库"; return ""; } //获取该数据库对应优先级的配置信息 DBConnectionInfo dbInfo = (DBConnectionInfo)_dbConfigInfo[name]; return dbInfo.dbType; } private DataSet SetSerializationType(DataSet _dataset) { if (_dataset != null) _dataset.RemotingFormat = SerializationFormat.Binary; return _dataset; } #region"数据操作" //执行带参数的SQL语句,返回DataSet //事务处理 public DataSet ExecuteQuery(string dbName, string priority, Guid guid, string Sql, CommandType cmdType, IDataParameter[] Params, object[] Values, out string err) { return ExecuteQueryBase(dbName, priority, guid, Sql, cmdType, Params, Values, out err); } private DataSet ExecuteQueryBase(string dbName, string priority, Guid guid, string Sql, CommandType cmdType, IDataParameter[] Params, object[] Values, out string err) { err = ""; DataSet ds = new DataSet(); //获取数据库连接... IDbConnection conn = null; IDbTransaction trans = null; if (guid != null) { //如果是事务 if (_transList.Contains(guid)) { TransInfo info = (TransInfo)_transList[guid]; conn = info.dbConnection; trans = info.dbTransaction; //如果事务已经失效,则返回 if (trans.Connection == null) { err = "事务已经失效!"; cwl_sql.WriteLog(string.Format("[执行失败:{0}]\n{1}", err, Sql), LogInfoLevel.Message, "ExecuteQuery", "ExecuteQueryBase"); return SetSerializationType(ds); } } else { err = "未找到请求的事务!"; cwl.WriteLog("未找到请求的事务", LogInfoLevel.Error, "ExecuteQuery", "ExecuteQueryBase"); cwl_sql.WriteLog(string.Format("[执行失败:{0}]\n{1}", err, Sql), LogInfoLevel.Message, "ExecuteQuery", "ExecuteQueryBase"); return SetSerializationType(ds); } } try { ArrayList outArys = null; ExecuteQueryFunc(conn, trans, Sql, cmdType, Params, Values, ref outArys); } catch (Exception ex) { err = ex.Message; cwl.WriteLog(err, LogInfoLevel.Error, "ExecuteQuery", "ExecuteQueryBase"); cwl_sql.WriteLog(string.Format("[执行失败:{0}]\n{1}", err, Sql), LogInfoLevel.Message, "ExecuteQuery", "ExecuteQueryBase"); } return SetSerializationType(ds); } public DataSet ExecuteQuery(string dbName, string priority, string Sql, CommandType cmdType, IDataParameter[] Params, object[] Values, out string err) { return this.ExecuteQuery(dbName, priority, Sql, cmdType, Params, Values, out err, false); } //非事务处理 public DataSet ExecuteQuery(string dbName, string priority, string Sql, CommandType cmdType, IDataParameter[] Params, object[] Values, out string err, bool ifDBLink) { if (ifDBLink) { return ExecuteQueryDBLink(dbName, priority, Sql, cmdType, Params, Values, out err); } else { err = ""; DataSet ds = new DataSet(); //获取数据库连接... IDbConnection conn = GetDbConnection(dbName, priority, Sql); try { ArrayList outArys = null; ds = ExecuteQueryFunc(conn, null, Sql, cmdType, Params, Values, ref outArys); } catch (Exception ex) { err = ex.Message; cwl_sql.WriteLog(string.Format("[执行失败:{0}]\n{1}", err, Sql), LogInfoLevel.Message, "ExecuteQuery", "ExecuteQuery"); } finally { ReleaseDbConnection(dbName, priority, conn, Sql); } return SetSerializationType(ds); } } //非事务处理 private DataSet ExecuteQueryDBLink(string dbName, string priority, string Sql, CommandType cmdType, IDataParameter[] Params, object[] Values, out string err) { err = ""; DataSet ds = new DataSet(); //获取数据库连接... IDbConnection conn = null; IDbTransaction trans = null; conn = GetDbConnection(dbName, priority, Sql); if (conn == null) { err = "获取数据库连接失败!"; cwl_sql.WriteLog(string.Format("[执行失败:{0}]\n{1}", err, Sql), LogInfoLevel.Message, "ExecuteQuery", "ExecuteQueryDBLink"); return SetSerializationType(ds); } try { DataProvider.IDataProvider dataProvider = GetDataProvider(conn.GetType()); IDbCommand command = conn.CreateCommand(); DbDataAdapter adapter = dataProvider.CreateDataAdapterObject(); ((IDbDataAdapter)adapter).SelectCommand = command; trans = conn.BeginTransaction(); command.CommandText = Sql; command.CommandType = cmdType; command.Transaction = trans; //给所有的参数赋值 if (Params != null && Values != null) { for (int i = 0; i < Params.Length; i++) { command.Parameters.Add(Params[i]); ((IDbDataParameter)command.Parameters[i]).Value = Values[i]; } } adapter.Fill(ds); command.Transaction.Commit(); command.CommandText = "begin dbms_session.close_database_link('XGCX');end;"; command.ExecuteNonQuery(); cwl_sql.WriteLog(adapter.SelectCommand.CommandText, LogInfoLevel.Message, "ExecuteQuery", "ExecuteQueryDBLink"); } catch (Exception ex) { err = ex.Message; if (trans != null) { trans.Rollback(); } cwl_sql.WriteLog(string.Format("[执行失败:{0}]\n{1}", err, Sql), LogInfoLevel.Message, "ExecuteQuery", "ExecuteQueryDBLink"); } finally { ReleaseDbConnection(dbName, priority, conn, Sql); } return SetSerializationType(ds); } //执行带参数的SQL语句,返回DataSet //事务处理 public DataSet ExecuteQuery(string dbName, string priority, Guid guid, string Sql, CommandType cmdType, string[] ParameterNames, DbType[] DbTypes, ParameterDirection[] Directions, bool[] IsNullables, string[] SourceColumns, DataRowVersion[] SourceVersions, object[] Values, ref ArrayList OutputValues, out string err) { err = ""; DataSet ds = null; ds = new DataSet(); //获取数据库连接... IDbConnection conn = null; IDbTransaction trans = null; //如果是事务 if (_transList.Contains(guid)) { //Console.WriteLine("事务:执行数据库操作{0}...\n", Sql); TransInfo info = (TransInfo)_transList[guid]; conn = info.dbConnection; trans = info.dbTransaction; //如果事务已经失效,则返回 if (trans.Connection == null) { err = "事务已经失效!"; cwl_sql.WriteLog(string.Format("[执行失败:{0}]\n{1}", err, Sql), LogInfoLevel.Message, "ExecuteQuery", "ExecuteQuery"); return SetSerializationType(ds); } } else { err = "未找到请求的事务!"; cwl_sql.WriteLog(string.Format("[执行失败:{0}]\n{1}", err, Sql), LogInfoLevel.Message, "ExecuteQuery", "ExecuteQuery"); return SetSerializationType(ds); } try { IDataParameter[] Params = CreateParams(conn, ParameterNames, DbTypes, Directions); ds = ExecuteQueryFunc(conn, trans, Sql, cmdType, Params, Values, ref OutputValues); } catch (Exception ex) { err = ex.Message; trans.Rollback(); cwl_sql.WriteLog(string.Format("[执行失败:{0}]\n{1}", err, Sql), LogInfoLevel.Message, "ExecuteQuery", "ExecuteQuery"); } return SetSerializationType(ds); } public DataSet ExecuteQuery(string dbName, string priority, string Sql, CommandType cmdType, string[] ParameterNames, DbType[] DbTypes, ParameterDirection[] Directions, bool[] IsNullables, string[] SourceColumns, DataRowVersion[] SourceVersions, object[] Values, ref ArrayList OutputValues, out string err) { return ExecuteQuery(dbName, priority, Sql, cmdType, ParameterNames, DbTypes, Directions, IsNullables, SourceColumns, SourceVersions, Values, ref OutputValues, out err, false); } //非事务处理 public DataSet ExecuteQuery(string dbName, string priority, string Sql, CommandType cmdType, string[] ParameterNames, DbType[] DbTypes, ParameterDirection[] Directions, bool[] IsNullables, string[] SourceColumns, DataRowVersion[] SourceVersions, object[] Values, ref ArrayList OutputValues, out string err, bool ifDBLink) { err = ""; DataSet ds = null; ds = new DataSet(); //获取数据库连接... IDbConnection conn = null; //获取数据库连接 conn = GetDbConnection(dbName, priority, Sql); try { IDataParameter[] Params = CreateParams(conn, ParameterNames, DbTypes, Directions); ds = ExecuteQueryFunc(conn, null, Sql, cmdType, Params, Values, ref OutputValues); } catch (Exception ex) { err = ex.Message; cwl_sql.WriteLog(string.Format("[执行失败:{0}]\n{1}", err, Sql), LogInfoLevel.Message, "ExecuteQuery", "ExecuteQuery"); } finally { //释放连接 ReleaseDbConnection(dbName, priority, conn, Sql); } return SetSerializationType(ds); } private IDataParameter[] CreateParams(IDbConnection conn, string[] ParameterNames, DbType[] DbTypes, ParameterDirection[] Directions) { DataProvider.IDataProvider dataProvider = GetDataProvider(conn.GetType()); //给所有的参数赋值 IDataParameter[] Params = null; if (ParameterNames != null) { if (ParameterNames.GetLength(0) != DbTypes.GetLength(0) && ParameterNames.GetLength(0) != Directions.GetLength(0)) { throw new Exception("传入参数数据个数不一致!"); } Params = new IDataParameter[ParameterNames.GetLength(0)]; for (int i = 0; i < ParameterNames.Length; i++) { IDbDataParameter parameter = dataProvider.CreateDataParameter(); parameter.ParameterName = ParameterNames[i]; if (conn is System.Data.OracleClient.OracleConnection) { try { ((System.Data.OracleClient.OracleParameter)parameter).OracleType = (System.Data.OracleClient.OracleType)DbTypes[i]; } catch { parameter.DbType = DbTypes[i]; } } else { parameter.DbType = DbTypes[i]; } if (parameter.Direction != System.Data.ParameterDirection.Input) parameter.Size = 200; parameter.Direction = Directions[i]; Params[i] = parameter; } } return Params; } private DataSet ExecuteQueryFunc(IDbConnection conn, IDbTransaction trans, string Sql, CommandType cmdType, IDataParameter[] Params, object[] Values, ref ArrayList OutputValues) { //////////////////////////////////////////////////////////////////////////测试用////////////////////////////////////////////////////////////////////////// ExecuteQueryToFile(conn, trans, Sql, cmdType, Params, Values, ref OutputValues); //////////////////////////////////////////////////////////////////////////////////// DataSet ds = null; ds = new DataSet(); if (conn == null) { cwl_sql.WriteLog(string.Format("[执行失败:获取数据库连接失败!]\n{0}", Sql), LogInfoLevel.Message, "ExecuteQuery", "ExecuteQuery"); return SetSerializationType(ds); } DataProvider.IDataProvider dataProvider = GetDataProvider(conn.GetType()); IDbCommand command = conn.CreateCommand(); DbDataAdapter adapter = dataProvider.CreateDataAdapterObject(); ((IDbDataAdapter)adapter).SelectCommand = command; command.CommandText = Sql; command.CommandType = cmdType; //设置事务 if (trans != null) { command.Transaction = trans; } //给所有的参数赋值 if (Params != null && Values != null) { for (int i = 0; i < Params.Length; i++) { command.Parameters.Add(Params[i]); ((IDbDataParameter)command.Parameters[i]).Value = Values[i]; } } adapter.Fill(ds); //返回输出参数值 if (OutputValues != null) { for (int k = 0; k < command.Parameters.Count; k++) { if (((IDbDataParameter)command.Parameters[k]).Direction != ParameterDirection.Input) { OutputValues.Add(((IDbDataParameter)command.Parameters[k]).Value); } } } cwl_sql.WriteLog(adapter.SelectCommand.CommandText, LogInfoLevel.Message, "ExecuteQuery", "ExecuteQuery"); return ds; } private void ExecuteQueryToFile(IDbConnection conn, IDbTransaction trans, string Sql, CommandType cmdType, IDataParameter[] Params, object[] Values, ref ArrayList OutputValues) { //////////////////////////////////////////////////////////////////////////测试用////////////////////////////////////////////////////////////////////////// if (!Sql.Contains("mb_orderneedack")) return; //////////////////////////////////////////////////////////////////////////////////// DataSet ds = null; ds = new DataSet(); DataProvider.IDataProvider dataProvider = null; IDbCommand command = null; IDataReader reader = null; FileStream filestream = null; BinaryWriter bw = null; try { if (conn == null) { cwl_sql.WriteLog(string.Format("[执行失败:获取数据库连接失败!]\n{0}", Sql), LogInfoLevel.Message, "ExecuteQuery", "ExecuteQuery"); return; } dataProvider = GetDataProvider(conn.GetType()); command = conn.CreateCommand(); command.CommandText = Sql; command.CommandType = cmdType; //设置事务 if (trans != null) { command.Transaction = trans; } //给所有的参数赋值 if (Params != null && Values != null) { for (int i = 0; i < Params.Length; i++) { command.Parameters.Add(Params[i]); ((IDbDataParameter)command.Parameters[i]).Value = Values[i]; } } reader = command.ExecuteReader(CommandBehavior.SequentialAccess); string tmp_file_path = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "~senddata"); if (!Directory.Exists(tmp_file_path)) { Directory.CreateDirectory(tmp_file_path); } filestream = new FileStream(Path.Combine(tmp_file_path, DateTime.Now.Ticks.ToString() + ".tmp"), FileMode.CreateNew, FileAccess.ReadWrite); byte[] buffer = null; MemoryStream ms = new MemoryStream(); reader.GetSchemaTable().WriteXmlSchema(ms, false); ms.Flush(); buffer = ms.ToArray(); ms.Close(); bw = new BinaryWriter(filestream); bw.Write(buffer.GetLength(0)); bw.Write(buffer); ArrayList Obj = new ArrayList(); bool notFinished = false; object[] datas = new object[reader.FieldCount]; do { notFinished = reader.Read(); if (notFinished) { reader.GetValues(datas); Obj.Add((object)(datas)); } if (Obj.Count == 1000 || !notFinished) { byte[] data_byte = Utility.SerializeAndCompressObject(Obj); bw.Write(data_byte.GetLength(0)); bw.Write(data_byte); bw.Flush(); Obj.Clear(); } } while (notFinished); //返回输出参数值 if (OutputValues != null) { for (int k = 0; k < command.Parameters.Count; k++) { if (((IDbDataParameter)command.Parameters[k]).Direction != ParameterDirection.Input) { OutputValues.Add(((IDbDataParameter)command.Parameters[k]).Value); } } } cwl_sql.WriteLog(command.CommandText, LogInfoLevel.Message, "ExecuteQuery", "ExecuteQuery"); } catch (Exception ex) { throw ex; } finally { if (bw != null) bw.Close(); if (filestream != null) filestream.Close(); } return; } //不通过DBServer时使用 //事务处理 public int ExecuteNonQuery_NoDBSever(string dbName, string priority, Guid guid, string Sql, CommandType cmdType, IDataParameter[] Params, out string err) { err = ""; int lines = -1;//受影响的行数 //获取数据库连接... IDbConnection conn = null; IDbTransaction trans = null; //如果是事务 if (_transList.Contains(guid)) { //Console.WriteLine("事务:执行数据库操作{0}...\n", Sql); TransInfo info = (TransInfo)_transList[guid]; conn = info.dbConnection; trans = info.dbTransaction; //如果事务已经失效,则返回 if (trans.Connection == null) { err = "事务已经失效!"; cwl_sql.WriteLog(string.Format("[执行失败:{0}]\n{1}", err, Sql), LogInfoLevel.Message, "ExecuteQuery", "ExecuteNonQuery_NoDBSever"); return lines; } } else { err = "未找到请求的事务!"; cwl_sql.WriteLog(string.Format("[执行失败:{0}]\n{1}", err, Sql), LogInfoLevel.Message, "ExecuteQuery", "ExecuteNonQuery_NoDBSever"); return lines; } if (conn == null) { err = "获取数据库连接失败!"; cwl_sql.WriteLog(string.Format("[执行失败:{0}]\n{1}", err, Sql), LogInfoLevel.Message, "ExecuteQuery", "ExecuteNonQuery_NoDBSever"); return lines; } try { DataProvider.IDataProvider dataProvider = GetDataProvider(conn.GetType()); IDbCommand command = conn.CreateCommand(); command.CommandText = Sql; command.CommandType = cmdType; command.Transaction = trans; //给所有的参数赋值 if (Params != null) { for (int i = 0; i < Params.Length; i++) { command.Parameters.Add(Params[i]); } } lines = command.ExecuteNonQuery(); cwl_sql.WriteLog(PraseProducePara(command), LogInfoLevel.Message, command.CommandType.ToString(), command.CommandText); } catch (Exception ex) { trans.Rollback(); err = ex.Message; cwl_sql.WriteLog(string.Format("[执行失败:{0}]\n{1}", err, Sql), LogInfoLevel.Message, "ExecuteQuery", "ExecuteNonQuery_NoDBSever"); } return lines; } //非事务处理 public int ExecuteNonQuery_NoDBSever(string dbName, string priority, string Sql, CommandType cmdType, IDataParameter[] Params, out string err) { err = ""; int lines = -1;//受影响的行数 //获取数据库连接... IDbConnection conn = null; //获取数据库连接 conn = GetDbConnection(dbName, priority, Sql); if (conn == null) { err = "获取数据库连接失败!"; cwl_sql.WriteLog(string.Format("[执行失败:{0}]\n{1}", err, Sql), LogInfoLevel.Message, "ExecuteQuery", "ExecuteNonQuery_NoDBSever"); return lines; } try { DataProvider.IDataProvider dataProvider = GetDataProvider(conn.GetType()); IDbCommand command = conn.CreateCommand(); command.CommandText = Sql; command.CommandType = cmdType; //给所有的参数赋值 if (Params != null) { for (int i = 0; i < Params.Length; i++) { command.Parameters.Add(Params[i]); } } lines = command.ExecuteNonQuery(); cwl_sql.WriteLog(PraseProducePara(command), LogInfoLevel.Message, command.CommandType.ToString(), command.CommandText); } catch (Exception ex) { err = ex.Message; cwl_sql.WriteLog(string.Format("[执行失败:{0}]\n{1}", err, Sql), LogInfoLevel.Message, "ExecuteQuery", "ExecuteNonQuery_NoDBSever"); } finally { ReleaseDbConnection(dbName, priority, conn, Sql); } return lines; } //执行带参数的SQL语句,返回受影响的行数 //事务处理 public int ExecuteNonQuery(string dbName, string priority, Guid guid, string Sql, CommandType cmdType, IDataParameter[] Params, object[] Values, out string err) { err = ""; int lines = -1;//受影响的行数 //获取数据库连接... IDbConnection conn = null; IDbTransaction trans = null; //如果是事务 if (_transList.Contains(guid)) { //Console.WriteLine("事务:执行数据库操作{0}...\n", Sql); TransInfo info = (TransInfo)_transList[guid]; conn = info.dbConnection; trans = info.dbTransaction; //如果事务已经失效,则返回 if (trans.Connection == null) { err = "事务已经失效!"; cwl_sql.WriteLog(string.Format("[执行失败:{0}]\n{1}", err, Sql), LogInfoLevel.Message, "ExecuteQuery", "ExecuteNonQuery_NoDBSever"); return lines; } } else { err = "未找到请求的事务!"; cwl_sql.WriteLog(string.Format("[执行失败:{0}]\n{1}", err, Sql), LogInfoLevel.Message, "ExecuteQuery", "ExecuteNonQuery_NoDBSever"); return lines; } if (conn == null) { err = "获取数据库连接失败!"; cwl_sql.WriteLog(string.Format("[执行失败:{0}]\n{1}", err, Sql), LogInfoLevel.Message, "ExecuteQuery", "ExecuteNonQuery_NoDBSever"); return lines; } try { DataProvider.IDataProvider dataProvider = GetDataProvider(conn.GetType()); IDbCommand command = conn.CreateCommand(); command.CommandText = Sql; command.CommandType = cmdType; command.Transaction = trans; //给所有的参数赋值 if (Params != null && Values != null) { for (int i = 0; i < Params.Length; i++) { command.Parameters.Add(Params[i]); ((IDbDataParameter)command.Parameters[i]).Value = Values[i]; } } lines = command.ExecuteNonQuery(); cwl_sql.WriteLog(PraseProducePara(command), LogInfoLevel.Message, command.CommandType.ToString(), command.CommandText); } catch (Exception ex) { err = ex.Message; trans.Rollback(); cwl_sql.WriteLog(string.Format("[执行失败:{0}]\n{1}", err, Sql), LogInfoLevel.Message, "ExecuteQuery", "ExecuteNonQuery_NoDBSever"); } return lines; } //非事务处理 public int ExecuteNonQuery(string dbName, string priority, string Sql, CommandType cmdType, IDataParameter[] Params, object[] Values, out string err) { err = ""; int lines = -1;//受影响的行数 //获取数据库连接... IDbConnection conn = null; //获取数据库连接 conn = GetDbConnection(dbName, priority, Sql); if (conn == null) { err = "获取数据库连接失败!"; cwl_sql.WriteLog(string.Format("[执行失败:{0}]\n{1}", err, Sql), LogInfoLevel.Message, "ExecuteNonQuery", "ExecuteNonQuery"); return lines; } try { DataProvider.IDataProvider dataProvider = GetDataProvider(conn.GetType()); IDbCommand command = conn.CreateCommand(); command.CommandText = Sql; command.CommandType = cmdType; //给所有的参数赋值 if (Params != null && Values != null) { for (int i = 0; i < Params.Length; i++) { command.Parameters.Add(Params[i]); ((IDbDataParameter)command.Parameters[i]).Value = Values[i]; } } lines = command.ExecuteNonQuery(); cwl_sql.WriteLog(PraseProducePara(command), LogInfoLevel.Message, command.CommandType.ToString(), command.CommandText); } catch (Exception ex) { err = ex.Message; cwl_sql.WriteLog(string.Format("[执行失败:{0}]\n{1}", err, Sql), LogInfoLevel.Message, "ExecuteNonQuery", "ExecuteNonQuery"); } finally { //释放连接 ReleaseDbConnection(dbName, priority, conn, Sql); } return lines; } //执行带参数的SQL语句,返回受影响的行数 // 事务操作 public int ExecuteNonQuery(string dbName, string priority, Guid guid, string Sql, CommandType cmdType, string[] ParameterNames, DbType[] DbTypes, ParameterDirection[] Directions, bool[] IsNullables, string[] SourceColumns, DataRowVersion[] SourceVersions, object[] Values, ref ArrayList OutputValues, out string err) { err = ""; int lines = -1;//受影响的行数 //获取数据库连接... IDbConnection conn = null; IDbTransaction trans = null; //如果是事务 if (_transList.Contains(guid)) { TransInfo info = (TransInfo)_transList[guid]; conn = info.dbConnection; trans = info.dbTransaction; //如果事务已经失效,则返回 if (trans.Connection == null) { err = "事务已经失效!"; cwl_sql.WriteLog(string.Format("[执行失败:{0}]\n{1}", err, Sql), LogInfoLevel.Message, "ExecuteNonQuery", "ExecuteNonQuery"); return lines; } } else { err = "未找到请求的事务!"; cwl_sql.WriteLog(string.Format("[执行失败:{0}]\n{1}", err, Sql), LogInfoLevel.Message, "ExecuteNonQuery", "ExecuteNonQuery"); return lines; } if (conn == null) { err = "获取数据库连接失败!"; cwl_sql.WriteLog(string.Format("[执行失败:{0}]\n{1}", err, Sql), LogInfoLevel.Message, "ExecuteNonQuery", "ExecuteNonQuery"); return lines; } showsql(Sql); try { DataProvider.IDataProvider dataProvider = GetDataProvider(conn.GetType()); IDbCommand command = conn.CreateCommand(); command.CommandText = Sql; command.CommandType = cmdType; //设置事务 command.Transaction = trans; if (ParameterNames != null) { for (int i = 0; i < ParameterNames.Length; i++) { IDbDataParameter parameter = dataProvider.CreateDataParameter(); parameter.ParameterName = ParameterNames[i]; parameter.Value = Values[i]; parameter.Direction = Directions[i]; if (conn is System.Data.OracleClient.OracleConnection) { try { ((System.Data.OracleClient.OracleParameter)parameter).OracleType = (System.Data.OracleClient.OracleType)DbTypes[i]; } catch { parameter.DbType = DbTypes[i]; } } else { parameter.DbType = DbTypes[i]; } if (parameter.Direction != System.Data.ParameterDirection.Input) parameter.Size = 200; parameter.Direction = Directions[i]; command.Parameters.Add(parameter); } } lines = command.ExecuteNonQuery(); //返回输出参数值 if (OutputValues != null) { for (int k = 0; k < command.Parameters.Count; k++) { if (((IDbDataParameter)command.Parameters[k]).Direction != ParameterDirection.Input) { OutputValues.Add(((IDbDataParameter)command.Parameters[k]).Value); } } } cwl_sql.WriteLog(PraseProducePara(command), LogInfoLevel.Message, command.CommandType.ToString(), command.CommandText); } catch (System.Exception ex) { err = ex.Message; trans.Rollback(); cwl_sql.WriteLog(string.Format("[执行失败:{0}]\n{1}", err, Sql), LogInfoLevel.Message, "ExecuteNonQuery", "ExecuteNonQuery"); } return lines; } //非事务处理 public int ExecuteNonQuery(string dbName, string priority, string Sql, CommandType cmdType, string[] ParameterNames, DbType[] DbTypes, ParameterDirection[] Directions, bool[] IsNullables, string[] SourceColumns, DataRowVersion[] SourceVersions, object[] Values, ref ArrayList OutputValues, out string err) { err = ""; int lines = -1;//受影响的行数 //获取数据库连接... IDbConnection conn = null; //获取数据库连接 conn = GetDbConnection(dbName, priority, Sql); if (conn == null) { err = "获取数据库连接失败!"; cwl_sql.WriteLog(string.Format("[执行失败:{0}]\n{1}", err, Sql), LogInfoLevel.Message, "ExecuteNonQuery", "ExecuteNonQuery"); return lines; } try { DataProvider.IDataProvider dataProvider = GetDataProvider(conn.GetType()); IDbCommand command = conn.CreateCommand(); command.CommandText = Sql; command.CommandType = cmdType; //给所有的参数赋值 if (ParameterNames != null) { for (int i = 0; i < ParameterNames.Length; i++) { IDbDataParameter parameter = dataProvider.CreateDataParameter(); parameter.ParameterName = ParameterNames[i]; parameter.Value = Values[i]; parameter.Direction = Directions[i]; if (conn is System.Data.OracleClient.OracleConnection) { try { ((System.Data.OracleClient.OracleParameter)parameter).OracleType = (System.Data.OracleClient.OracleType)DbTypes[i]; } catch { parameter.DbType = DbTypes[i]; } } else { parameter.DbType = DbTypes[i]; } if (parameter.Direction != System.Data.ParameterDirection.Input) parameter.Size = 200; parameter.Direction = Directions[i]; command.Parameters.Add(parameter); } } lines = command.ExecuteNonQuery(); //返回输出参数值 if (OutputValues != null) { for (int k = 0; k < command.Parameters.Count; k++) { if (((IDbDataParameter)command.Parameters[k]).Direction != ParameterDirection.Input) { OutputValues.Add(((IDbDataParameter)command.Parameters[k]).Value); } } } cwl_sql.WriteLog(PraseProducePara(command), LogInfoLevel.Message, command.CommandType.ToString(), command.CommandText); } catch (Exception ex) { err = ex.Message; cwl_sql.WriteLog(string.Format("[执行失败:{0}]\n{1}", err, Sql), LogInfoLevel.Message, "ExecuteNonQuery", "ExecuteNonQuery"); } finally { //释放连接 ReleaseDbConnection(dbName, priority, conn, Sql); } return lines; } //事务处理 public int ExecuteNonQuery(string dbName, string priority, Guid guid, string Sql, CommandType cmdType, string[] ParameterNames, DbType[] DbTypes, ParameterDirection[] Directions, bool[] IsNullables, string[] SourceColumns, DataRowVersion[] SourceVersions, int[] Sizes, object[] Values, ref ArrayList OutputValues, out string err) { err = ""; int lines = -1;//受影响的行数 //获取数据库连接... IDbConnection conn = null; IDbTransaction trans = null; //如果是事务 if (_transList.Contains(guid)) { //Console.WriteLine("事务:执行数据库操作{0}...\n", Sql); TransInfo info = (TransInfo)_transList[guid]; conn = info.dbConnection; trans = info.dbTransaction; //如果事务已经失效,则返回 if (trans.Connection == null) { err = "事务已经失效!"; cwl_sql.WriteLog(string.Format("[执行失败:{0}]\n{1}", err, Sql), LogInfoLevel.Message, "ExecuteNonQuery", "ExecuteNonQuery"); return lines; } } else { err = "未找到请求的事务!"; cwl_sql.WriteLog(string.Format("[执行失败:{0}]\n{1}", err, Sql), LogInfoLevel.Message, "ExecuteNonQuery", "ExecuteNonQuery"); return lines; } if (conn == null) { err = "获取数据库连接失败!"; cwl_sql.WriteLog(string.Format("[执行失败:{0}]\n{1}", err, Sql), LogInfoLevel.Message, "ExecuteNonQuery", "ExecuteNonQuery"); return lines; } try { DataProvider.IDataProvider dataProvider = GetDataProvider(conn.GetType()); DbDataAdapter adapter = dataProvider.CreateDataAdapterObject(); IDbCommand command = conn.CreateCommand(); command.CommandText = Sql; command.CommandType = cmdType; command.Transaction = trans; //给所有的参数赋值 if (ParameterNames != null && DbTypes != null && Values != null) { for (int i = 0; i < ParameterNames.Length; i++) { IDbDataParameter parameter = dataProvider.CreateDataParameter(); parameter.ParameterName = ParameterNames[i]; if (conn is System.Data.OracleClient.OracleConnection) { try { ((System.Data.OracleClient.OracleParameter)parameter).OracleType = (System.Data.OracleClient.OracleType)DbTypes[i]; } catch { parameter.DbType = DbTypes[i]; } } else { parameter.DbType = DbTypes[i]; } parameter.Direction = Directions[i]; if (parameter.Direction != System.Data.ParameterDirection.Input) parameter.Size = 200; parameter.Direction = Directions[i]; parameter.Value = Values[i]; command.Parameters.Add(parameter); } } lines = command.ExecuteNonQuery(); //返回输出参数值 if (OutputValues != null) { for (int k = 0; k < command.Parameters.Count; k++) { if (((IDbDataParameter)command.Parameters[k]).Direction != ParameterDirection.Input) { OutputValues.Add(((IDbDataParameter)command.Parameters[k]).Value); } } } cwl_sql.WriteLog(PraseProducePara(command), LogInfoLevel.Message, command.CommandType.ToString(), command.CommandText); } catch (Exception ex) { err = ex.Message; trans.Rollback(); cwl_sql.WriteLog(string.Format("[执行失败:{0}]\n{1}", err, Sql), LogInfoLevel.Message, "ExecuteNonQuery", "ExecuteNonQuery"); } return lines; } //非事务处理 public int ExecuteNonQuery(string dbName, string priority, string Sql, CommandType cmdType, string[] ParameterNames, DbType[] DbTypes, ParameterDirection[] Directions, bool[] IsNullables, string[] SourceColumns, DataRowVersion[] SourceVersions, int[] Sizes, object[] Values, ref ArrayList OutputValues, out string err) { err = ""; int lines = -1;//受影响的行数 //获取数据库连接... IDbConnection conn = null; //获取数据库连接 conn = GetDbConnection(dbName, priority, Sql); if (conn == null) { err = "获取数据库连接失败!"; cwl_sql.WriteLog(string.Format("[执行失败:{0}]\n{1}", err, Sql), LogInfoLevel.Message, "ExecuteNonQuery", "ExecuteNonQuery"); return lines; } showsql(Sql); try { DataProvider.IDataProvider dataProvider = GetDataProvider(conn.GetType()); DbDataAdapter adapter = dataProvider.CreateDataAdapterObject(); IDbCommand command = conn.CreateCommand(); command.CommandText = Sql; command.CommandType = cmdType; //给所有的参数赋值 if (ParameterNames != null && DbTypes != null && Values != null) { for (int i = 0; i < ParameterNames.Length; i++) { IDbDataParameter parameter = dataProvider.CreateDataParameter(); parameter.ParameterName = ParameterNames[i]; if (conn is System.Data.OracleClient.OracleConnection) { try { ((System.Data.OracleClient.OracleParameter)parameter).OracleType = (System.Data.OracleClient.OracleType)DbTypes[i]; } catch { parameter.DbType = DbTypes[i]; } } else { parameter.DbType = DbTypes[i]; } parameter.Direction = Directions[i]; parameter.Size = Sizes[i]; parameter.Value = Values[i]; command.Parameters.Add(parameter); } } lines = command.ExecuteNonQuery(); //返回输出参数值 if (OutputValues != null) { for (int k = 0; k < command.Parameters.Count; k++) { if (((IDbDataParameter)command.Parameters[k]).Direction != ParameterDirection.Input) { OutputValues.Add(((IDbDataParameter)command.Parameters[k]).Value); } } } cwl_sql.WriteLog(PraseProducePara(command), LogInfoLevel.Message, command.CommandType.ToString(), command.CommandText); } catch (Exception ex) { err = ex.Message; cwl_sql.WriteLog(string.Format("[执行失败:{0}]\n{1}", err, Sql), LogInfoLevel.Message, "ExecuteNonQuery", "ExecuteNonQuery"); } finally { ReleaseDbConnection(dbName, priority, conn, Sql); } return lines; } public bool UpdateTable(string dbName, string priority, Guid guid, string Sql, CommandType cmdType, IDataParameter[] Params, object[] Values, DataTable dt, out string err) { err = ""; bool result = true; //获取数据库连接... IDbConnection conn = null; IDbTransaction trans = null; //如果是事务 if (_transList.Contains(guid)) { //Console.WriteLine("事务:更新DataSet<{0}>...\n", Sql); TransInfo info = (TransInfo)_transList[guid]; conn = info.dbConnection; trans = info.dbTransaction; //如果事务已经失效,则返回 if (trans.Connection == null) { err = "事务已经失效!"; cwl_sql.WriteLog(string.Format("[执行失败:{0}]\n{1}", err, Sql), LogInfoLevel.Message, "UpdateTable", "UpdateTable"); return false; } } else { err = "未找到请求的事务!"; cwl_sql.WriteLog(string.Format("[执行失败:{0}]\n{1}", err, Sql), LogInfoLevel.Message, "UpdateTable", "UpdateTable"); return false; } if (conn == null) { err = "获取数据库连接失败!"; cwl_sql.WriteLog(string.Format("[执行失败:{0}]\n{1}", err, Sql), LogInfoLevel.Message, "UpdateTable", "UpdateTable"); return false; } try { DataProvider.IDataProvider dataProvider = GetDataProvider(conn.GetType()); DbDataAdapter adapter = dataProvider.CreateDataAdapterObject(); IDbCommand command = conn.CreateCommand(); command.CommandText = Sql; command.CommandType = cmdType; command.Transaction = trans; ((IDbDataAdapter)adapter).SelectCommand = command; //给所有的参数赋值 if (Params != null && Values != null) { for (int i = 0; i < Params.Length; i++) { command.Parameters.Add(Params[i]); } } //自动生成SqlCommand命令 object CB = dataProvider.CreateCommandBuilder(adapter); //提交数据更改 adapter.Update(dt); cwl_sql.WriteLog(PraseProducePara(command), LogInfoLevel.Message, command.CommandType.ToString(), command.CommandText); } catch (Exception ex) { err = ex.Message; trans.Rollback(); result = false; cwl_sql.WriteLog(string.Format("[执行失败:{0}]\n{1}", err, Sql), LogInfoLevel.Message, "UpdateTable", "UpdateTable"); } return result; } //非事务处理 public bool UpdateTable(string dbName, string priority, string Sql, CommandType cmdType, IDataParameter[] Params, object[] Values, DataTable dt, out string err) { err = ""; bool result = false; //获取数据库连接... IDbConnection conn = null; //获取数据库连接 conn = GetDbConnection(dbName, priority, Sql); if (conn == null) { err = "获取数据库连接失败!"; cwl_sql.WriteLog(string.Format("[执行失败:{0}]\n{1}", err, Sql), LogInfoLevel.Message, "UpdateTable", "UpdateTable"); return false; } try { DataProvider.IDataProvider dataProvider = GetDataProvider(conn.GetType()); DbDataAdapter adapter = dataProvider.CreateDataAdapterObject(); IDbCommand command = conn.CreateCommand(); command.CommandText = Sql; command.CommandType = cmdType; ((IDbDataAdapter)adapter).SelectCommand = command; //给所有的参数赋值 if (Params != null && Values != null) { for (int i = 0; i < Params.Length; i++) { command.Parameters.Add(Params[i]); ((IDbDataParameter)command.Parameters[i]).Value = Values[i]; } } //自动生成SqlCommand命令 object CB = dataProvider.CreateCommandBuilder(adapter); //提交数据更改 adapter.Update(dt); cwl_sql.WriteLog(PraseProducePara(command), LogInfoLevel.Message, command.CommandType.ToString(), command.CommandText); } catch (Exception ex) { err = ex.Message; result = false; cwl_sql.WriteLog(string.Format("[执行失败:{0}]\n{1}", err, Sql), LogInfoLevel.Message, "UpdateTable", "UpdateTable"); } finally { ReleaseDbConnection(dbName, priority, conn, Sql); } return result; } //事务处理 public bool UpdateTable(string dbName, string priority, Guid guid, string Sql, CommandType cmdType, string[] ParameterNames, DbType[] DbTypes, object[] Values, DataTable dt, out string err) { err = ""; bool result = true; //获取数据库连接... IDbConnection conn = null; IDbTransaction trans = null; //如果是事务 if (_transList.Contains(guid)) { //Console.WriteLine("事务:更新DataSet<{0}>...\n", Sql); TransInfo info = (TransInfo)_transList[guid]; conn = info.dbConnection; trans = info.dbTransaction; //如果事务已经失效,则返回 if (trans.Connection == null) { err = "事务已经失效!"; cwl.WriteLog(err, LogInfoLevel.Error, "UpdateTable", "事务1"); cwl_sql.WriteLog(string.Format("[执行失败:{0}]\n{1}", err, Sql), LogInfoLevel.Message, "UpdateTable", "UpdateTable"); return false; } } else { err = "未找到请求的事务!"; cwl_sql.WriteLog(string.Format("[执行失败:{0}]\n{1}", err, Sql), LogInfoLevel.Message, "UpdateTable", "UpdateTable"); return false; } if (conn == null) { err = "获取数据库连接失败!"; cwl_sql.WriteLog(string.Format("[执行失败:{0}]\n{1}", err, Sql), LogInfoLevel.Message, "UpdateTable", "UpdateTable"); return false; } try { DataProvider.IDataProvider dataProvider = GetDataProvider(conn.GetType()); DbDataAdapter adapter = dataProvider.CreateDataAdapterObject(); IDbCommand command = conn.CreateCommand(); command.CommandText = Sql; command.CommandType = cmdType; command.Transaction = trans; //给所有的参数赋值 if (ParameterNames != null && DbTypes != null && Values != null) { for (int i = 0; i < ParameterNames.Length; i++) { IDbDataParameter parameter = dataProvider.CreateDataParameter(); parameter.ParameterName = ParameterNames[i]; if (conn is System.Data.OracleClient.OracleConnection) { try { ((System.Data.OracleClient.OracleParameter)parameter).OracleType = (System.Data.OracleClient.OracleType)DbTypes[i]; } catch { parameter.DbType = DbTypes[i]; } } else { parameter.DbType = DbTypes[i]; } parameter.Value = Values[i]; command.Parameters.Add(parameter); } } ((IDbDataAdapter)adapter).SelectCommand = command; //自动生成SqlCommand命令 object CB = dataProvider.CreateCommandBuilder(adapter); //提交数据更改 adapter.Update(dt); cwl_sql.WriteLog(PraseProducePara(command), LogInfoLevel.Message, command.CommandType.ToString(), command.CommandText); } catch (Exception ex) { err = ex.Message; trans.Rollback(); result = false; cwl_sql.WriteLog(string.Format("[执行失败:{0}]\n{1}", err, Sql), LogInfoLevel.Message, "UpdateTable", "UpdateTable"); } return result; } //非事务处理 public bool UpdateTable(string dbName, string priority, string Sql, CommandType cmdType, string[] ParameterNames, DbType[] DbTypes, object[] Values, DataTable dt, out string err) { err = ""; bool result = true; //获取数据库连接... IDbConnection conn = null; //获取数据库连接 conn = GetDbConnection(dbName, priority, Sql); if (conn == null) { err = "获取数据库连接失败!"; cwl_sql.WriteLog(string.Format("[执行失败:{0}]\n{1}", err, Sql), LogInfoLevel.Message, "UpdateTable", "UpdateTable"); return false; } try { DataProvider.IDataProvider dataProvider = GetDataProvider(conn.GetType()); DbDataAdapter adapter = dataProvider.CreateDataAdapterObject(); IDbCommand command = conn.CreateCommand(); command.CommandText = Sql; command.CommandType = cmdType; //给所有的参数赋值 if (ParameterNames != null && DbTypes != null && Values != null) { for (int i = 0; i < ParameterNames.Length; i++) { IDbDataParameter parameter = dataProvider.CreateDataParameter(); parameter.ParameterName = ParameterNames[i]; if (conn is System.Data.OracleClient.OracleConnection) { try { ((System.Data.OracleClient.OracleParameter)parameter).OracleType = (System.Data.OracleClient.OracleType)DbTypes[i]; } catch { parameter.DbType = DbTypes[i]; } } else { parameter.DbType = DbTypes[i]; } parameter.Value = Values[i]; command.Parameters.Add(parameter); } } ((IDbDataAdapter)adapter).SelectCommand = command; //自动生成SqlCommand命令 object CB = dataProvider.CreateCommandBuilder(adapter); //提交数据更改 adapter.Update(dt); cwl_sql.WriteLog(PraseProducePara(command), LogInfoLevel.Message, command.CommandType.ToString(), command.CommandText); } catch (Exception ex) { err = ex.Message; result = false; cwl_sql.WriteLog(string.Format("[执行失败:{0}]\n{1}", err, Sql), LogInfoLevel.Message, "UpdateTable", "UpdateTable"); } finally { //释放连接 ReleaseDbConnection(dbName, priority, conn, Sql); } return result; } #endregion #region"基础操作" public IDbCommand GetCommand(string dbName, string priority, Guid guid, out string err) { err = ""; //获取数据库连接... IDbConnection conn = null; IDbTransaction trans = null; //如果是事务 if (_transList.Contains(guid)) { //Console.WriteLine("事务:更新DataSet<{0}>...\n", Sql); TransInfo info = (TransInfo)_transList[guid]; conn = info.dbConnection; trans = info.dbTransaction; //如果事务已经失效,则返回 if (trans.Connection == null) { err = "事务已经失效"; return null; } } else { //Console.WriteLine("更新DataSet<{0}>...\n", Sql); //获取数据库连接 conn = GetDbConnection(dbName, priority, "GetCommand"); } if (conn == null) { err = "获取数据库连接失败!"; return null; } IDbCommand command = conn.CreateCommand(); return command; } public IDbTransaction GetTransaction(string dbName, string priority, Guid guid, out string err) { err = ""; IDbConnection conn = null; IDbTransaction trans = null; //如果是事务 if (_transList.Contains(guid)) { //Console.WriteLine("事务:更新DataSet<{0}>...\n", Sql); TransInfo info = (TransInfo)_transList[guid]; trans = info.dbTransaction; conn = info.dbConnection; //如果事务已经失效,则返回 if (trans.Connection == null) { err = "事务已经失效"; return null; } } else { err = "没有事务!"; return null; } if (conn == null) { err = "获取数据库连接失败!"; return null; } return trans; } /// /// 获取连接提供者 /// /// /// private static DataProvider.IDataProvider GetDataProvider(string dbType) { DataProvider.IDataProvider dataProvider = (DataProvider.IDataProvider)_dataProviderNameList[dbType.ToUpper()]; return dataProvider; } public DataProvider.IDataProvider GetDataProvider(string dbName, out string err) { err = ""; return GetDataProvider(this.GetDbType(dbName, out err)); } public DataProvider.IDataProvider GetDataProvider(Guid guid, out string err) { err = ""; IDbConnection conn = null; //如果是事务 if (_transList.Contains(guid)) { //Console.WriteLine("事务:更新DataSet<{0}>...\n", Sql); TransInfo info = (TransInfo)_transList[guid]; conn = info.dbConnection; } if (conn == null) { err = "获取数据库连接失败!"; return null; } return GetDataProvider(conn.GetType()); } private static DataProvider.IDataProvider GetDataProvider(System.Type dbType) { DataProvider.IDataProvider dataProvider = (DataProvider.IDataProvider)_dataProviderTypeList[dbType]; return dataProvider; } public System.Guid BeginTransaction(string dbName, string priority, long dbManagerID, double minutes, out string err) { return BeginTransaction("", dbName, priority, dbManagerID, minutes, out err); } /// /// 开始处理事务,同时指定该事务最长处理时间,单位为分钟,返回结果表示是否成功 /// 不支持嵌套事务 /// /// /// /// /// /// /// public System.Guid BeginTransaction(string methodName, string dbName, string priority, long dbManagerID, double minutes, out string err) { lock (_transList) { err = ""; Guid guid = Guid.NewGuid(); //获取数据库连接 IDbConnection conn = GetDbConnection(dbName, priority, methodName); if (conn == null) { err = "获取数据库连接失败!"; return guid; } //设置事务信息,包括数据库连接、事务、事务开始时间等 TransInfo info = new TransInfo(); info.dbConnection = conn; info.beginTime = DateTime.Now; info.dbManagerID = dbManagerID; try { info.dbTransaction = conn.BeginTransaction(); ; _transList.Add(guid, info); } catch (Exception ex) { err = ex.Message; ReleaseDbConnection(dbName, priority, conn, err); } return guid; } } //提交当前事务,返回结果表示是否成功 public bool Commit(string dbName, string priority, Guid guid, out string err) { lock (_transList) { bool result = true; err = ""; if (!_transList.Contains(guid)) { err = "不存在要提交的事务"; return false; } TransInfo info = (TransInfo)_transList[guid]; IDbConnection conn = info.dbConnection; IDbTransaction trans = info.dbTransaction; try { trans.Commit(); } catch (Exception ex) { err = ex.Message; result = false; cwl.WriteLog(err, LogInfoLevel.Error, "Rollback", ""); } finally { //删除事务 ReleaseDbConnection(dbName, priority, conn, "Commit:" + guid.ToString()); _transList.Remove(guid); } return result; } } //回滚当前事务,返回结果表示是否成功 public bool Rollback(string dbName, string priority, Guid guid, out string err) { lock (_transList) { bool result = true; err = ""; if (!_transList.Contains(guid)) { err = "不存在要回滚的事务"; return false; } TransInfo info = (TransInfo)_transList[guid]; IDbConnection conn = info.dbConnection; IDbTransaction trans = info.dbTransaction; try { trans.Rollback(); } catch (Exception ex) { err = ex.Message; result = false; cwl.WriteLog(err, LogInfoLevel.Error, "Rollback", ""); } finally { //删除事务 ReleaseDbConnection(dbName, priority, conn, "Rollback:" + guid.ToString()); _transList.Remove(guid); } return result; } } /// /// 从数据库配置文件中读取数据库连接信息 /// /// 文件名称 /// 是否成功 private bool ReadDbConnectionInfo(string fileName) { _dbConfigInfo = new Hashtable(); string dbName = ""; string type = ""; string priority = ""; string maxNum = ""; //如果文件存在则读取配置文件 if (File.Exists(fileName) == true) { try { XmlTextReader reader = null; try { //打开数据库配置文件,并忽略所有的空格 reader = new XmlTextReader(fileName); reader.WhitespaceHandling = WhitespaceHandling.None; DBConnectionInfo dbConnectionInfo = new DBConnectionInfo(); dbConnectionInfo.connectionPool = new Hashtable(); //解释XML文件 while (reader.Read()) { //bool bFlag = false; switch (reader.NodeType) { case XmlNodeType.Element: type = reader.Name; break; case XmlNodeType.Text: if (type.Equals("name")) { dbName = reader.Value; dbConnectionInfo.dbName = dbName; } else { if (type.Equals("type")) { dbConnectionInfo.dbType = reader.Value; } else { if (type.Equals("connectionString")) { dbConnectionInfo.connectionString = reader.Value; } else { if (type.Equals("connectionPool")) { //dbConnectionInfo.connectionPool = new Hashtable(); } else { if (type.Equals("priority")) { priority = reader.Value; } else { if (type.Equals("maxConnectionNum")) { maxNum = reader.Value; } } } } } } type = ""; break; case XmlNodeType.EndElement: if (reader.Name.Equals("connectionPool")) { dbConnectionInfo.connectionPool.Add(priority, maxNum); priority = ""; maxNum = ""; } else { if (reader.Name.Equals("database")) { _dbConfigInfo.Add(dbName, dbConnectionInfo); dbName = ""; dbConnectionInfo = new DBConnectionInfo(); dbConnectionInfo.connectionPool = new Hashtable(); } } break; } } } catch { string errMsg = string.Format("读取数据库定义文件 [{0}] 出错! Last_Item:[{1}]", fileName, dbName); cwl.WriteLog(errMsg); ShowLog(errMsg); } finally { if (reader != null) reader.Close(); } } catch { return false; } } else//读取默认设置 { return false; } return true; } // 获取数据库连接 private IDbConnection GetDbConnection(string dbName, string priority, string sqlstr) { IDbConnection conn = null; //直接从数据库连接池中取连接,无连接则直接返回 Hashtable ht1 = (Hashtable)_connList[dbName]; if (ht1 == null) { cwl.WriteLog("获取数据库连接失败!", LogInfoLevel.Message, "ht1:" + dbName, "GetDbConnection"); return conn; } try { Hashtable ht2 = (Hashtable)ht1[priority]; } catch (Exception eeeee) { cwl.WriteLog("获取数据库连接失败!", LogInfoLevel.Message, "ht1:" + dbName, eeeee.Message); } if (ht2 == null) { cwl.WriteLog("获取数据库连接失败!", LogInfoLevel.Message, "ht2:" + dbName + "/" + priority, "GetDbConnection"); return conn; } lock (ht2) { ArrayList freeList = ht2[0] as ArrayList; //排队,最长时间1秒 //{ // for (int i = 0; i < 10; i++) // { // Thread.Sleep(100); // if (freeList.Count > 0) // { // i = 10; // } // } //} if (freeList.Count <= 0) { ArrayList al = ht2[1] as ArrayList; if (al == null) al = new ArrayList(); cwl.WriteLog("数据库忙,请稍后再试!", LogInfoLevel.Message, "<<<>>> " + dbName + " <<<>>> freeList||" + al.Count.ToString(), "GetDbConnection"); return null; } conn = (IDbConnection)freeList[0]; freeList.Remove(conn); Hashtable busyList = (Hashtable)ht2[1]; if (busyList == null) { busyList = new Hashtable(); ht2.Add(1, busyList); } DataProvider.IDataProvider dataProvider = GetDataProvider(conn.GetType()); try { if (conn.State != ConnectionState.Open) { string strConnState = conn.State.ToString(); conn.Close(); conn.Dispose(); conn = null; GC.Collect(); foreach (DictionaryEntry it in _dbConfigInfo) { DBConnectionInfo info = (DBConnectionInfo)it.Value; if (info.dbName == dbName) { conn = dataProvider.CreateConnectionObject(info.connectionString); conn.Open(); cwl.WriteLog("重连成功!||连接状态:" + strConnState, LogInfoLevel.Message, info.dbName, "GetDbConnection"); break; } } } } catch (Exception ex) { cwl.WriteLog(ex.Message, LogInfoLevel.Error, "", "GetDbConnection"); return null; } CurrConnOperateInfo cco = new CurrConnOperateInfo(); cco.dt = DateTime.Now; cco.sqlstr = sqlstr; cco.SID = dataProvider.GetSID(ref conn); busyList.Add(conn, cco); return conn; } } private void ReleaseDbConnection(string dbName, string priority, IDbConnection conn, string SqlText) { if (conn == null) { return; } Hashtable ht1 = (Hashtable)_connList[dbName]; if (ht1 == null) { return; } Hashtable ht2 = (Hashtable)ht1[priority]; if (ht2 == null) { return; } lock (ht2) { Hashtable busyList = (Hashtable)ht2[1]; if (busyList != null) { if (!busyList.Contains(conn)) { // 连接已被检验线程处理,此处不在处理 //cwl.WriteLog(SqlText, LogInfoLevel.Message, "", "ReleaseDbConnection"); return; } busyList.Remove(conn); } ArrayList freeList = ht2[0] as ArrayList; if (freeList == null) { freeList = new ArrayList(); ht2.Add(0, freeList); } freeList.Add(conn); } } /// /// 初始化数据提供接口 /// /// public static void AddDataProvider(DataProvider.IDataProvider dataProvider) { _dataProviderNameList[dataProvider.Name.ToUpper()] = dataProvider; _dataProviderTypeList[dataProvider.ConnectionType] = dataProvider; } private void CreateAllConnections() { //如果连接已经创建,则返回 if (_connList.Count > 0) { return; } int idx = 0; foreach (DictionaryEntry it in _dbConfigInfo) { DBConnectionInfo info = (DBConnectionInfo)it.Value; DataProvider.IDataProvider dataProvider = GetDataProvider(info.dbType); Hashtable ht1 = new Hashtable(); idx++; ShowLog(string.Format(" [{0}/{1}] {2} {3}", idx, _dbConfigInfo.Count, info.dbName, info.dbType)); int jdx = 0; foreach (DictionaryEntry pool in info.connectionPool) { jdx++; Hashtable ht2 = new Hashtable(); ArrayList connList = new ArrayList(); for (int i = 0; i < Convert.ToInt32(pool.Value); i++) { ShowLog(string.Format(" 连接池[{4}/{5}]: 建立连接[{0}/{1}]: {2} ({3})", i + 1, Convert.ToInt32(pool.Value), info.dbName, info.dbType, jdx, info.connectionPool.Count)); try { IDbConnection conn = dataProvider.CreateConnectionObject(info.connectionString); conn.Open(); connList.Add(conn); } catch { cwl.WriteLog("创建数据库连接" + info.dbName + " " + pool.Key + " " + i.ToString() + "失败!", LogInfoLevel.Error, info.dbName, "CreateAllConnections"); break; } } ht2.Add(0, connList); ht1.Add(pool.Key, ht2); } _connList.Add(info.dbName, ht1); } cwl.WriteLog("启动成功!数据库连接池创建成功!"); } #region 原来代码 maliang 2011-10-19 /* private void FixConnections() { while (true) { try { foreach (DictionaryEntry it in _dbConfigInfo) { DBConnectionInfo info = (DBConnectionInfo)it.Value; DataProvider.IDataProvider dataProvider = GetDataProvider(info.dbType); Hashtable ht1 = (Hashtable)_connList[info.dbName]; foreach (DictionaryEntry pool in info.connectionPool) { Hashtable ht2 = (Hashtable)ht1[pool.Key]; lock (ht2) { ArrayList connList = ht2[0] as ArrayList; Hashtable busyConnList = (Hashtable)ht2[1]; int connNumber = 0; if (connList != null) { connNumber = connList.Count; } else { connList = new ArrayList(); ht2.Remove(0); ht2.Add(0, connList); } if (busyConnList != null) { connNumber += busyConnList.Count; } if (connNumber < Convert.ToInt32(pool.Value)) { cwl.WriteLog("有数据库连接意外销毁,增加数据库连接!", LogInfoLevel.Message, info.dbName, "FixConnections"); for (int i = connNumber; i < Convert.ToInt32(pool.Value); i++) { try { IDbConnection conn = dataProvider.CreateConnectionObject(info.connectionString); conn.Open(); connList.Add(conn); cwl.WriteLog("增加数据库连接" + info.dbName + " " + pool.Key + " " + i.ToString() + "成功!", LogInfoLevel.Message, info.dbName, "FixConnections"); } catch (Exception ex) { cwl.WriteLog("增加数据库连接" + info.dbName + " " + pool.Key + " " + i.ToString() + "失败!", LogInfoLevel.Error, info.dbName, "FixConnections"); Console.WriteLine("增加数据库连接" + info.dbName + " " + pool.Key + " " + "失败!" + ex.Message + "\n"); break; } } } } } } } catch (Exception ex) { cwl.WriteLog(ex.Message, LogInfoLevel.Error, "", "FixConnections"); } Thread.Sleep(3 * 60 * 1000); } } private void CheckConnActive() { while (true) { try { if (_init) { foreach (DictionaryEntry it in _connList) { Hashtable ht1 = (Hashtable)it.Value; string dbName = it.Key as string; DBConnectionInfo info = (DBConnectionInfo)_dbConfigInfo[dbName]; DataProvider.IDataProvider dataProvider = GetDataProvider(info.dbType); foreach (DictionaryEntry it2 in ht1) { ArrayList connList = ((Hashtable)it2.Value)[0] as ArrayList; #region // 检查闲列表 //for ( int l = 0 ; l< connList.Count ;l++) //{ // IDbConnection conn = connList[l] as IDbConnection ; // if(conn!=null) // { // if(!dataProvider.Ping(ref conn) ) // { // //Thread.Sleep( 1000); // //if(!dataProvider.Ping(ref conn) ) // //{ // cwl.WriteLog("连接失效,重新连接中......", LogInfoLevel.Message, info.dbName, "CheckConnActive"); // Console.WriteLine(info.dbName + "连接失效,重新连接中......\n"); // //connList.Remove(conn); // if (conn != null ) // { // conn.Close(); // conn.Dispose(); // conn = null; // GC.Collect(); // } // try // { // conn = dataProvider.CreateConnectionObject(info.connectionString); // conn.Open(); // connList[l] = conn; // cwl.WriteLog("重连成功!", LogInfoLevel.Message, info.dbName, "CheckConnActive"); // Console.WriteLine(info.dbName + "重连成功!\n"); // } // catch(Exception ex) // { // cwl.WriteLog("重连失败!", LogInfoLevel.Error, info.dbName, "CheckConnActive"); // Console.WriteLine(info.dbName + "重连失败!" +ex.Message + "\n"); // } // //} // } // } // else // { // try // { // conn = dataProvider.CreateConnectionObject(info.connectionString); // conn.Open(); // connList[l]= conn; // Console.WriteLine(info.dbName + "重连成功!\n"); // cwl.WriteLog("重连成功!", LogInfoLevel.Message, info.dbName, "CheckConnActive"); // } // catch(Exception ex) // { // Console.WriteLine("重连失败!" + ex.Message + "\n"); // cwl.WriteLog("重连失败!", LogInfoLevel.Error, info.dbName, "CheckConnActive"); // } // } //} #endregion #region // 检查忙列表 if (((Hashtable)it2.Value).Count < 2) continue; Hashtable busyConnList = ((Hashtable)it2.Value)[1] as Hashtable; if (busyConnList != null) { Hashtable m_busyConnList = busyConnList.Clone() as Hashtable; foreach (DictionaryEntry busyConn in m_busyConnList) { DateTime dt = ((CurrConnOperateInfo)busyConn.Value).dt; DateTime t = DateTime.Now; if ((string)it2.Key == "A") { t = dt.AddSeconds(_connLifeTimeA); } else if ((string)it2.Key == "B") { t = dt.AddSeconds(_connLifeTimeB); } else if ((string)it2.Key == "C") { t = dt.AddSeconds(_connLifeTimeC); } #region //判断是否已经超时 if (t.CompareTo(DateTime.Now) < 0) { IDbConnection conn = busyConn.Key as IDbConnection; if (conn != null) { try { cwl.WriteLog("有连接超时,将关闭重连!||忙连接数:" + busyConnList.Count.ToString() + "||闲连接数:" + connList.Count.ToString() + " SID:" + ((CurrConnOperateInfo)busyConn.Value).SID.ToString() + " SQL:" + ((CurrConnOperateInfo)busyConn.Value).sqlstr + " 执行开始时间:" + ((CurrConnOperateInfo)busyConn.Value).dt.ToLongTimeString() + " 当前时间:" + DateTime.Now.ToLongTimeString(), LogInfoLevel.Error, info.dbName, "CheckConnActive"); busyConnList.Remove(conn); conn.Close(); conn.Dispose(); conn = null; GC.Collect(); conn = dataProvider.CreateConnectionObject(info.connectionString); conn.Open(); if (connList == null) { connList = new ArrayList(); ht1.Remove(0); ht1.Add(0, connList); } connList.Add(conn); cwl.WriteLog("超时连接重连成功!||忙连接数:" + busyConnList.Count.ToString() + "||闲连接数:" + connList.Count.ToString(), LogInfoLevel.Message, info.dbName, "CheckConnActive"); } catch (Exception ex) { cwl.WriteLog("重连失败,丢失一个连接!", LogInfoLevel.Error, info.dbName, "CheckConnActive"); Console.WriteLine("重连失败,丢失一个连接!" + ex.Message + "\n"); } } else { try { cwl.WriteLog("有连接失效,将关闭重连!", LogInfoLevel.Error, info.dbName, "CheckConnActive"); Console.WriteLine(info.dbName + "有连接失效,将关闭重连!\n"); busyConnList.Remove(conn); conn = dataProvider.CreateConnectionObject(info.connectionString); conn.Open(); if (connList == null) { connList = new ArrayList(); ht1.Remove(0); ht1.Add(0, connList); } connList.Add(conn); } catch (Exception ex) { cwl.WriteLog("重连失败,丢失一个连接!", LogInfoLevel.Error, info.dbName, "CheckConnActive"); Console.WriteLine("重连失败,丢失一个连接!" + ex.Message + "\n"); } } } #endregion } } #endregion } } } } catch (Exception ex) { cwl.WriteLog(ex.Message, LogInfoLevel.Error, "", "CheckConnActive"); // Console.WriteLine(ex.Message); } Thread.Sleep(1 * 60 * 1000); } } */ #endregion #region 变更代码 maliang 2011-10-19 private static object lockObj = new object(); private void ConnectionsListener() { while (true) { lock (lockObj) { CheckConnActive(); FixConnections(); Thread.Sleep(1 * 60 * 1000); } } } private void FixConnections() { try { foreach (DictionaryEntry it in _dbConfigInfo) { DBConnectionInfo info = (DBConnectionInfo)it.Value; DataProvider.IDataProvider dataProvider = GetDataProvider(info.dbType); Hashtable ht1 = (Hashtable)_connList[info.dbName]; foreach (DictionaryEntry pool in info.connectionPool) { Hashtable ht2 = (Hashtable)ht1[pool.Key]; lock (ht2) { ArrayList connList = ht2[0] as ArrayList; Hashtable busyConnList = (Hashtable)ht2[1]; int connNumber = 0; if (connList != null) { connNumber = connList.Count; } else { connList = new ArrayList(); ht2.Remove(0); ht2.Add(0, connList); } if (busyConnList != null) { connNumber += busyConnList.Count; } if (connNumber < Convert.ToInt32(pool.Value)) { cwl.WriteLog("有数据库连接意外销毁,增加数据库连接!", LogInfoLevel.Message, info.dbName, "FixConnections"); for (int i = connNumber; i < Convert.ToInt32(pool.Value); i++) { try { IDbConnection conn = dataProvider.CreateConnectionObject(info.connectionString); conn.Open(); connList.Add(conn); cwl.WriteLog("增加数据库连接" + info.dbName + " " + pool.Key + " " + i.ToString() + "成功!", LogInfoLevel.Message, info.dbName, "FixConnections"); } catch (Exception ex) { cwl.WriteLog("增加数据库连接" + info.dbName + " " + pool.Key + " " + i.ToString() + "失败!", LogInfoLevel.Error, info.dbName, "FixConnections"); Console.WriteLine("增加数据库连接" + info.dbName + " " + pool.Key + " " + "失败!" + ex.Message + "\n"); break; } } } } } } } catch (Exception ex) { cwl.WriteLog(ex.Message, LogInfoLevel.Error, "", "FixConnections"); } } private void CheckConnActive() { try { if (_init) { foreach (DictionaryEntry it in _connList) { Hashtable ht1 = (Hashtable)it.Value; string dbName = it.Key as string; DBConnectionInfo info = (DBConnectionInfo)_dbConfigInfo[dbName]; DataProvider.IDataProvider dataProvider = GetDataProvider(info.dbType); foreach (DictionaryEntry it2 in ht1) { ArrayList connList = ((Hashtable)it2.Value)[0] as ArrayList; #region // 检查忙列表 if (((Hashtable)it2.Value).Count < 2) continue; Hashtable busyConnList = ((Hashtable)it2.Value)[1] as Hashtable; if (busyConnList != null) { Hashtable m_busyConnList = busyConnList.Clone() as Hashtable; foreach (DictionaryEntry busyConn in m_busyConnList) { DateTime dt = ((CurrConnOperateInfo)busyConn.Value).dt; DateTime t = DateTime.Now; if ((string)it2.Key == "A") { t = dt.AddSeconds(_connLifeTimeA); } else if ((string)it2.Key == "B") { t = dt.AddSeconds(_connLifeTimeB); } else if ((string)it2.Key == "C") { t = dt.AddSeconds(_connLifeTimeC); } #region //判断是否已经超时 if (t.CompareTo(DateTime.Now) < 0) { IDbConnection conn = busyConn.Key as IDbConnection; if (conn != null) { try { cwl.WriteLog("有连接超时,将关闭重连!||忙连接数:" + busyConnList.Count.ToString() + "||闲连接数:" + connList.Count.ToString() + " SID:" + ((CurrConnOperateInfo)busyConn.Value).SID.ToString() + " SQL:" + ((CurrConnOperateInfo)busyConn.Value).sqlstr + " 执行开始时间:" + ((CurrConnOperateInfo)busyConn.Value).dt.ToLongTimeString() + " 当前时间:" + DateTime.Now.ToLongTimeString(), LogInfoLevel.Error, info.dbName, "CheckConnActive"); busyConnList.Remove(conn); conn.Close(); conn.Dispose(); conn = null; GC.Collect(); conn = dataProvider.CreateConnectionObject(info.connectionString); conn.Open(); if (connList == null) { connList = new ArrayList(); ht1.Remove(0); ht1.Add(0, connList); } connList.Add(conn); cwl.WriteLog("超时连接重连成功!||忙连接数:" + busyConnList.Count.ToString() + "||闲连接数:" + connList.Count.ToString(), LogInfoLevel.Message, info.dbName, "CheckConnActive"); } catch (Exception ex) { cwl.WriteLog("重连失败,丢失一个连接!", LogInfoLevel.Error, info.dbName, "CheckConnActive"); Console.WriteLine("重连失败,丢失一个连接!" + ex.Message + "\n"); } } else { try { cwl.WriteLog("有连接失效,将关闭重连!", LogInfoLevel.Error, info.dbName, "CheckConnActive"); Console.WriteLine(info.dbName + "有连接失效,将关闭重连!\n"); busyConnList.Remove(conn); conn = dataProvider.CreateConnectionObject(info.connectionString); conn.Open(); if (connList == null) { connList = new ArrayList(); ht1.Remove(0); ht1.Add(0, connList); } connList.Add(conn); } catch (Exception ex) { cwl.WriteLog("重连失败,丢失一个连接!", LogInfoLevel.Error, info.dbName, "CheckConnActive"); Console.WriteLine("重连失败,丢失一个连接!" + ex.Message + "\n"); } } } #endregion } } #endregion } } } } catch (Exception ex) { cwl.WriteLog(ex.Message, LogInfoLevel.Error, "", "CheckConnActive"); // Console.WriteLine(ex.Message); } } #endregion #region //处理存储过程调用,打印相关参数值; private string PraseProducePara(IDbCommand command) { string sRet = ""; if (command.Parameters.Count > 0) foreach (IDataParameter idp in command.Parameters) { sRet += PraseOneParameter(idp.Value, 0, idp.ParameterName); } return sRet; } private string PraseOneParameter(object obj, int level, string obj_name) { /*if (_p.GetType().FullName.ToUpper() == "Oracle.DataAccess.Client.OracleParameter".ToUpper()) { Oracle.DataAccess.Client.OracleParameter p1 = (Oracle.DataAccess.Client.OracleParameter)(_p); if (p1.CollectionType == Oracle.DataAccess.Client.OracleCollectionType.PLSQLAssociativeArray) { } }*/ string sRet = ""; string prefix = "".PadLeft(2 * level, ' '); bool isEnumerable = false; if (obj == null) { sRet += prefix + obj_name + ":= null;\r\n"; return sRet; } Type itype = obj.GetType(); PropertyInfo[] props = itype.GetProperties(); foreach (PropertyInfo p in props) { if (p.PropertyType.IsGenericType && p.PropertyType.GetInterface("IEnumerable", false) != null && typeof(string) == p.PropertyType.GetGenericArguments()[0]) { isEnumerable = true; } } if (isEnumerable) { int i = 1; foreach (object o in (IEnumerable)obj) { sRet += string.Format("{0}{1}{2}\n", (level == 0 ? obj_name + "(" + i.ToString() + ") := " : ""), prefix, PraseOneParameter(o, level + 1, "")); i++; } sRet += "}\r\n"; } else if (itype.IsArray) { int i = 1; foreach (object o in (IEnumerable)obj) { sRet += string.Format("{0}{1}{2}\n", (level == 0 ? obj_name + "(" + i.ToString() + ") := " : ""), prefix, PraseOneParameter(o, level + 1, "")); i++; } if (sRet.Substring(sRet.Length - 2, 2) == "\r\n") { sRet = sRet.Remove(sRet.Length - 2); } sRet += "\r\n"; } else { if (itype == typeof(string)) { sRet += (level == 0 ? obj_name + " := " : "") + string.Format("{0}'{1}';\r\n", prefix, obj.ToString()); } else { sRet += (level == 0 ? obj_name + " := " : "") + string.Format("{0}{1};\r\n", prefix, obj.ToString()); } } return sRet; } /* private string PraseOneParameter(object obj, int level, string obj_name) { string sRet = ""; string prefix = "".PadLeft(2 * level, ' '); bool isEnumerable = false; if (obj == null) { sRet += prefix + (level == 0 ? obj_name + ":" : "") + "'';\r\n"; return sRet; } Type itype = obj.GetType(); PropertyInfo[] props = itype.GetProperties(); foreach (PropertyInfo p in props) { if (p.PropertyType.IsGenericType && p.PropertyType.GetInterface("IEnumerable", false) != null && typeof(string) == p.PropertyType.GetGenericArguments()[0]) { isEnumerable = true; } } if (isEnumerable) { sRet += (level == 0 ? obj_name + ":\r\n" : "") + prefix + "{"; foreach (object o in (IEnumerable)obj) { sRet += PraseOneParameter(o, level + 1, ""); } sRet += "}\r\n"; } else if (itype.IsArray) { sRet += (level == 0 ? obj_name + ":\r\n" : "") + prefix + "{"; foreach (object o in (IEnumerable)obj) { sRet += PraseOneParameter(o, level + 1, ""); } if (sRet.Substring(sRet.Length - 2, 2) == "\r\n") { sRet = sRet.Remove(sRet.Length - 2); } sRet += "}\r\n"; } else { if (itype == typeof(string)) { sRet += (level == 0 ? obj_name + ":" : "") + string.Format("{0}'{1}';\r\n", prefix, obj.ToString()); } else { sRet += (level == 0 ? obj_name + ":" : "") + string.Format("{0}{1};\r\n", prefix, obj.ToString()); } } return sRet; } */ #endregion /////////////////////////////////////////////////////////////////////////////// ///私有数据成员 ////////////////////////////////////////////////////////////////////////////// //定义数据库连接信息 private struct DBConnectionInfo { public string dbName; public string dbType; public string connectionString; // public Hashtable connectionPool; }; // 存储当前连接的操作信息 private struct CurrConnOperateInfo { public DateTime dt; public string sqlstr; public int SID; } /// /// 事务信息 /// private struct TransInfo { public long dbManagerID; public IDbConnection dbConnection; public IDbTransaction dbTransaction; public DateTime beginTime; }; private void showsql(string sql) { //Console.WriteLine(sql+"\n"); } #endregion private static long[] _dbManagerID = new long[1] { 0 };//由DBProxy为每个DBManager对象分配的ID // private Hashtable _dbConfigInfo;//数据库配置信息 private static Hashtable _connList = new Hashtable(); private Hashtable _transList = new Hashtable(); private Hashtable _dbList = new Hashtable();//每个DBManager对应的数据库信息 private double _connLifeTimeA;//数据库连接允许的最长无反应时间A级 private double _connLifeTimeB;//数据库连接允许的最长无反应时间B级 private double _connLifeTimeC;//数据库连接允许的最长无反应时间C级 private Thread _checkConnThread = null;//检查Conn是否有效 private Thread _fixConnThread = null;//检查Conn是否有足够数量 private Thread _ConnectionsListenerThread;//检查Conn是否有效和是否有足够数量 private long _reference = 0;//DBProxy对象实例数 private bool _init = false; public delegate void ShowLogDelegate(string log); public event ShowLogDelegate ShowLogEvent; private void ShowLog(string log) { if (ShowLogEvent != null) { ShowLogEvent(log); } } public void SetLogHandler(ShowLogDelegate _handle) { ShowLogEvent += _handle; } } }