/// <summary> /// 生成数据库连接字符串 /// </summary> /// <param name="config">数据库配置</param> /// <param name="visitType">数据库访问类型</param> /// <returns>数据库连接字符串</returns> public string GenerateDBConStr(DatabaseConfig config, DBVisitType visitType) { if (config == null) { throw new ArgumentNullException(nameof(config)); } string conStr; switch (config.DBConInfoType) { case DBConstant.DBCONINFO_TYPE_DEFAULT: conStr = this.CreateDBOriginConnectionString(config, visitType); break; case DBConstant.DBCONINFO_TYPE_STRING: conStr = this.CreateDBSpliceConStr(config, visitType); break; default: throw new ArgumentException($"数据库配置项[{config.ConName}]数据库连接信息类型值[{config.DBConInfoType}]无效;可选值[0:内部拼接数据库连接字符串;1:直接使用字符串]"); } return(conStr); }
/// <summary> /// 释放数据库访问连接对象 /// </summary> /// <param name="con">数据库访问连接对象</param> /// <param name="visitType">数据库访问类型</param> internal void ReleaseDbConnection(DbConnection con, DBVisitType visitType) { if (visitType == DBVisitType.R) { if (this._config.ReadConCount < DBConstant.ReadConCount) { con.Close(); } else { this._readConPool.Add(con); } } else if (visitType == DBVisitType.W) { if (this._config.WriteConCount < DBConstant.WriteConCount) { con.Close(); } else { this._writeConPool.Add(con); } } else { throw new NotSupportedException(string.Format("不支持的访问类型:{0}", visitType.ToString())); } }
/// <summary> /// ExecuteScalar执行SQL语句,返回执行结果的第一行第一列; /// </summary> /// <param name="sqlStr">sql语句</param> /// <param name="visitType">数据库访问类型</param> /// <param name="parameterNameValueDic">参数名名称及对应的值字典集合[key:参数名称,含参数符号;value:参数值]</param> /// <returns>返回执行结果</returns> protected object PrimitiveExecuteScalar(string sqlStr, DBVisitType visitType, Dictionary <string, object> parameterNameValueDic = null) { using (var conInfo = new DbConnectionInfo(this._dbid, visitType)) { return(this.PrimitiveExecuteScalar(conInfo.DbConnection, sqlStr, parameterNameValueDic)); } }
/// <summary> /// 构造函数 /// </summary> /// <param name="dbid">数据库编号ID</param> /// <param name="visitType">数据库访问类型</param> public DbConnectionInfo(int dbid, DBVisitType visitType) { this.DBID = dbid; this.VisitType = visitType; this._dbConnectionPool = DbConnectionPoolManager.GetConnectionPoolByDBID(dbid); this.DbConnection = this._dbConnectionPool.GetDbConnection(visitType); }
/// <summary> /// ExecuteNonQuery执行SQL语句,返回受影响的行数 /// </summary> /// <param name="sqlStr">sql语句</param> /// <param name="visitType">数据库访问类型</param> /// <param name="parameterNameValueDic">参数名名称及对应的值字典集合[key:参数名称,含参数符号;value:参数值]</param> /// <returns>返回执行结果</returns> public int ExecuteNonQuery(string sqlStr, DBVisitType visitType, Dictionary <string, object> parameterNameValueDic = null) { using (var connectionInfo = new DbConnectionInfo(this._dbid, Model.DBVisitType.R)) { return(this.PrimitiveExecuteNonQuery(connectionInfo.DbConnection, sqlStr, parameterNameValueDic)); } }
/// <summary> /// 创建数据库拼接连接字符串 /// </summary> /// <param name="config">数据库配置</param> /// <param name="visitType">数据库访问类型</param> /// <returns>数据库连接字符串</returns> protected override string CreateDBSpliceConStr(DatabaseConfig config, DBVisitType visitType) { //SqlConnectionStringBuilder if (config.Port == 0) { config.Port = 1433; } return(string.Format(@"data source={0},{1};initial catalog={2};user id={3};password={4}", config.Host, config.Port, config.DatabaseName, config.Account, config.Password)); }
/// <summary> /// 创建数据库拼接连接字符串 /// </summary> /// <param name="config">数据库配置</param> /// <param name="visitType">数据库访问类型</param> /// <returns>数据库连接字符串</returns> protected override string CreateDBSpliceConStr(DatabaseConfig config, DBVisitType visitType) { //NpgsqlConnectionStringBuilder if (config.Port == 0) { config.Port = 5432; } //return $@"Port={config.Port};Host={config.Host};Username={config.Account};Password={config.Password};Database={config.DatabaseName}"; return($@"Server={config.Host};Port={config.Port};User ID={config.Account};Password={config.Password};Database={config.DatabaseName}"); }
/// <summary> /// 创建数据库拼接连接字符串 /// </summary> /// <param name="config">数据库配置</param> /// <param name="visitType">数据库访问类型</param> /// <returns>数据库连接字符串</returns> protected override string CreateDBSpliceConStr(DatabaseConfig config, DBVisitType visitType) { //MySqlConnectionStringBuilder builder = new MySqlConnectionStringBuilder(); if (config.Port == 0) { config.Port = 3306; } return(string.Format(@"database={0};data source={1};Port={2};user id={3};password={4}", config.DatabaseName, config.Host, config.Port, config.Account, config.Password)); }
/// <summary> /// 获取数据库访问连接对象 /// </summary> /// <param name="visitType">数据库访问类型</param> /// <returns>数据库访问连接对象</returns> internal DbConnection GetDbConnection(DBVisitType visitType) { DbConnection con = null; switch (visitType) { case DBVisitType.R: if (this._config.ReadConCount < DBConstant.ReadConCount) { con = this.CreateConnection(this._config, this._readConStr); } else { if (!this._readConPool.TryTake(out con, this._config.GetConTimeout)) { throw new ApplicationException("从连接池获取读连接超时"); } } break; case DBVisitType.W: if (this._config.WriteConCount < DBConstant.WriteConCount) { con = this.CreateConnection(this._config, this._writeConStr); } else { if (!this._writeConPool.TryTake(out con, this._config.GetConTimeout)) { throw new ApplicationException("从连接池获取写连接超时"); } } break; default: throw new NotSupportedException(string.Format("不支持的访问类型:{0}", visitType.ToString())); } try { if (con.State == ConnectionState.Closed) { con.Open(); } } catch (Exception ex) { this.ReleaseDbConnection(con, visitType); throw new ApplicationException("打开数据库连接异常", ex); } return(con); }
/// <summary> /// 创建数据库拼接连接字符串 /// </summary> /// <param name="config">数据库配置</param> /// <param name="visitType">数据库访问类型</param> /// <returns>数据库连接字符串</returns> protected override string CreateDBSpliceConStr(DatabaseConfig config, DBVisitType visitType) { var scsb = new SQLiteConnectionStringBuilder(); scsb.Pooling = true; scsb.DataSource = DirectoryInfoEx.GetFullPath(config.DatabaseName); if (!string.IsNullOrEmpty(config.Password)) { scsb.Password = config.Password; } return(this.CreateSQLiteDBConStr(scsb)); }
/// <summary> /// 创建数据库拼接连接字符串 /// </summary> /// <param name="config">数据库配置</param> /// <param name="visitType">数据库访问类型</param> /// <returns>数据库连接字符串</returns> protected override string CreateDBSpliceConStr(DatabaseConfig config, DBVisitType visitType) { //OracleConnectionStringBuilder if (config.Port == 0) { config.Port = 1521; } //注:不同版本的Oracle.ManagedDataAccess.dll,连接字符串不一定兼容,以下只启用支持的版本 //return string.Format(@"User Id={0};Password={1};Data Source={2}:{3}/{4}", config.Account, config.Password, config.Host, config.Port, config.DatabaseName); //return string.Format(@"User Id={0};Password={1};Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST={2})(PORT={3})))(CONNECT_DATA=(SERVICE_NAME={4})))", //config.Account, config.Password, config.Host, config.Port, config.DatabaseName); return($@"Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST={config.Host})(PORT={config.Port}))(CONNECT_DATA=(SID={config.DatabaseName})));User Id={config.Account};Password={config.Password}"); }
/// <summary> /// 构造函数 /// </summary> /// <param name="dbid">数据库ID</param> /// <param name="visitType">数据库访问类型</param> public TestContext(int dbid, DBVisitType visitType) : base(dbid, visitType, null) { }
/// <summary> /// 创建原生连接字符串 /// </summary> /// <param name="config">数据库配置</param> /// <param name="visitType">数据库访问类型</param> /// <returns>数据库连接字符串</returns> protected override string CreateDBOriginConnectionString(DatabaseConfig config, DBVisitType visitType) { var scsb = new SQLiteConnectionStringBuilder(config.ConStr); return(this.CreateSQLiteDBConStr(scsb)); }
/// <summary> /// 创建原生连接字符串 /// </summary> /// <param name="config">数据库配置</param> /// <param name="visitType">数据库访问类型</param> /// <returns>数据库连接字符串</returns> protected virtual string CreateDBOriginConnectionString(DatabaseConfig config, DBVisitType visitType) { return(config.ConStr); }
/// <summary> /// 创建数据库拼接连接字符串 /// </summary> /// <param name="config">数据库配置</param> /// <param name="visitType">数据库访问类型</param> /// <returns>数据库连接字符串</returns> protected abstract string CreateDBSpliceConStr(DatabaseConfig config, DBVisitType visitType);
/// <summary> /// 创建EF上下文接口 /// </summary> /// <param name="visitType">数据库访问类型</param> /// <param name="customRegisteEntityTypeFunc">自定义注册EF实体类型回调,已自定义注册实体返回true;否则返回false</param> /// <returns>IEFDbContext</returns> public IEFDbContext CreateEFDbContext(DBVisitType visitType, Func <DatabaseConfig, DbModelBuilder, bool> customRegisteEntityTypeFunc) { return(new EFDbContext(new DbConnectionInfo(this._dbid, visitType), customRegisteEntityTypeFunc)); }
/// <summary> /// 创建数据库接连对象 /// </summary> /// <param name="visitType">数据库访问类型</param> /// <returns>数据库接连对象</returns> public IDbConnectionInfo CreateConnection(DBVisitType visitType) { return(new DbConnectionInfo(this._dbid, visitType)); }
/// <summary> /// 构造函数 /// </summary> /// <param name="dbid">数据库ID</param> /// <param name="visitType">数据库访问类型</param> /// <param name="customRegisteEntityTypeFunc">自定义注册EF实体类型回调,已自定义注册实体返回true;否则返回false</param> public EFDbContext(int dbid, DBVisitType visitType, Func <DatabaseConfig, DbModelBuilder, bool> customRegisteEntityTypeFunc) : this(new UtilZ.Dotnet.DBIBase.Connection.DbConnectionInfo(dbid, visitType), customRegisteEntityTypeFunc) { }