using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using CSFramework.DB.Common;
using CSFramework.DB.Models;
using MySql.Data.MySqlClient;
using MySql.Data.Types;
using Oracle.ManagedDataAccess.Client;
using Oracle.ManagedDataAccess.Types;
namespace CSFramework.DB
{
///
/// 通用多数据库底层驱动(支持SqlServer,MySQL,Oracle)
/// 1.依赖app.config文件,需要配置数据库提供者.
/// 2.将app.config文件内容复制到应用程序的配置文件,因程序内使用AppSettings以及加载Oracle,MySql底层驱动。
///
public class DatabaseMDB : IDatabase
{
private string _ConnectionString;
private DatabaseType _DatabaseType;
public DatabaseMDB(DatabaseType providerType, string connectionString)
{
_DatabaseType = providerType;
_ConnectionString = connectionString;
}
public DatabaseType DatabaseType => _DatabaseType;
public CommandHelper CreateSqlProc(string spName)
{
var db =
DatabaseFactory.CreateDatabase(_DatabaseType,
_ConnectionString);
return db.CreateSqlProc(spName);
}
public CommandHelper CreateCommand(string commandText)
{
var db =
DatabaseFactory.CreateDatabase(_DatabaseType,
_ConnectionString);
return db.CreateCommand(commandText);
}
public int CommandTimeout
{
get
{
var defaultTimeOut = 30;
return DatabaseFactory.CommandTimeOut > 0
? DatabaseFactory.CommandTimeOut
: defaultTimeOut;
}
}
public int ConnectionTimeout
{
get
{
var defaultTimeOut = 15;
return DatabaseFactory.ConnectionTimeOut > 0
? DatabaseFactory.ConnectionTimeOut
: defaultTimeOut;
}
}
public string ConnectionString
{
get => _ConnectionString;
set => _ConnectionString = value;
}
public DateTime GetServerTime()
{
var db =
DatabaseFactory.CreateDatabase(_DatabaseType,
_ConnectionString);
return db.GetServerTime();
}
public string BuildConnectionString(string server, int port,
string dbName, string uid, string pwd, int timeout = 15)
{
if (_DatabaseType == DatabaseType.SqlServer)
return new DatabaseMSSQL("").BuildConnectionString(server, port,
dbName, uid, pwd, timeout);
if (_DatabaseType == DatabaseType.MySQL)
return new DatabaseMySQL("").BuildConnectionString(server, port,
dbName, uid, pwd, timeout);
if (_DatabaseType == DatabaseType.Oracle)
return new DatabaseOracle("").BuildConnectionString(server,
port, dbName, uid, pwd, timeout);
throw new Exception("数据库类型不支持!");
}
public int DefaultPort
{
get
{
if (_DatabaseType == DatabaseType.SqlServer) return 1433;
if (_DatabaseType == DatabaseType.MySQL) return 3306;
if (_DatabaseType == DatabaseType.Oracle) return 1521;
throw new Exception("数据库类型不支持!");
}
}
public DbParameter CreateTimestampParameter(string parameterName,
string fieldName)
{
DbParameter p;
if (DatabaseType.SqlServer == _DatabaseType)
{
p = new SqlParameter();
(p as SqlParameter).SqlDbType = SqlDbType.Timestamp;
}
else if (DatabaseType.MySQL == _DatabaseType)
{
p = new MySqlParameter();
(p as MySqlParameter).MySqlDbType = MySqlDbType.Timestamp;
}
else if (DatabaseType.Oracle == _DatabaseType)
{
p = new OracleParameter();
(p as OracleParameter).OracleDbType = OracleDbType.TimeStamp;
}
else
{
throw new Exception("请扩展" + GetType().Name +
".CreateTimestampParameter方法!");
}
p.SourceColumn = fieldName;
return p;
}
public Type DateTimeType
{
get
{
var T = typeof(SqlDateTime);
switch (_DatabaseType)
{
case DatabaseType.SqlServer:
T = typeof(SqlDateTime);
break;
case DatabaseType.MySQL:
T = typeof(MySqlDateTime);
break;
case DatabaseType.Oracle:
T = typeof(OracleDate);
break;
}
return T;
}
}
public string ParamSymboName { get; set; }
public DbCommand CreateCommand(string commandText,
CommandType commandType)
{
var cmd = DataProviderFactory.GetFactory(_DatabaseType)
.CreateCommand();
cmd.CommandText = CodeSafeHelper.GetSafeSQL(commandText);
cmd.CommandType = commandType;
cmd.CommandTimeout = CommandTimeout;
return cmd;
}
public DbParameter CreateParameter(string parameterName,
object parameterValue)
{
var p = DataProviderFactory.GetFactory(_DatabaseType)
.CreateParameter();
p.ParameterName = parameterName;
p.Value = parameterValue;
return p;
}
public DbParameter CreateParameter(string parameterName,
DbType parameterType, int size, string sourceColumn,
object parameterValue)
{
var p = DataProviderFactory.GetFactory(_DatabaseType)
.CreateParameter();
p.ParameterName = parameterName;
p.Value = parameterValue;
p.DbType = parameterType;
p.Size = size;
p.SourceColumn = sourceColumn;
return p;
}
public DbCommandBuilder CreateCommandBuilder()
{
return DataProviderFactory.GetFactory(_DatabaseType)
.CreateCommandBuilder();
}
public DbDataAdapter CreateDataAdapter()
{
return DataProviderFactory.GetFactory(_DatabaseType)
.CreateDataAdapter();
}
public DbDataAdapter CreateDataAdapter(
AdapterRowUpdatingEvent eventHandler)
{
return DataProviderFactory.GetFactory(_DatabaseType)
.CreateDataAdapter();
}
public DbConnection CreateConnection()
{
return CreateConnection(_DatabaseType, _ConnectionString);
}
public DbConnection CreateConnection(string connectionString)
{
return CreateConnection(_DatabaseType, connectionString);
}
public DbTransaction TransBegin()
{
return CreateConnection().BeginTransaction();
}
public void TransCommit(DbTransaction trans,
bool closeConnection = false)
{
trans.Commit();
if (closeConnection) Close(trans.Connection);
}
public void TransRollback(DbTransaction trans,
bool closeConnection = false)
{
trans.Rollback();
if (closeConnection) Close(trans.Connection);
}
public DataSet GetDataSet(string SQL)
{
DbConnection connection = null;
try
{
connection = CreateConnection();
return GetDataSet(SQL, connection);
}
finally
{
Close(connection);
}
}
///
/// 执行带参数的 Sql 语句或存储过程,并返回 DataSet 对象。
///
/// 要执行的 Sql 语句或存储过程名等。
/// CommandType 参数类型,即该命令是 sql 语句,还是存储过程名等。
/// 参数集合。
/// DataSet 对象。
public virtual DataSet GetDataSet(string SQL, CommandType type,
IDataParameter[] paramlist)
{
DbCommand cmd = null;
DbDataAdapter adapter = null;
DbConnection connection = null;
try
{
connection = CreateConnection();
cmd = DataProviderFactory.GetFactory(_DatabaseType)
.CreateCommand();
cmd.CommandText = CodeSafeHelper.GetSafeSQL(SQL);
cmd.CommandType = type;
cmd.Connection = connection;
if (paramlist != null)
cmd.Parameters.AddRange(paramlist);
var ds = new DataSet();
adapter = DataProviderFactory.GetFactory(_DatabaseType)
.CreateDataAdapter();
adapter.SelectCommand = cmd;
adapter.Fill(ds);
return ds;
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (adapter != null) adapter.Dispose();
if (cmd != null) cmd.Dispose();
Close(connection);
}
}
public DataSet GetDataSet(DbCommand cmd)
{
DbDataAdapter adapter = null;
DbConnection connection = null;
try
{
if (cmd.Connection == null)
cmd.Connection = connection = CreateConnection();
var ds = new DataSet();
adapter = DataProviderFactory.GetFactory(_DatabaseType)
.CreateDataAdapter();
adapter.SelectCommand = cmd;
adapter.Fill(ds);
return ds;
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (adapter != null) adapter.Dispose();
if (cmd != null) cmd.Dispose();
Close(connection);
}
}
public DataTable GetTable(string SQL, string tableName = "")
{
var dt = GetDataSet(SQL).Tables[0];
if (tableName != "") dt.TableName = tableName;
return dt;
}
public DataTable GetTop(int top, string tableName, string fields = "",
List where = null, string orderBy = "")
{
var db =
DatabaseFactory.CreateDatabase(_DatabaseType,
_ConnectionString);
return db.GetTop(top, tableName, fields, where, orderBy);
}
public DataTable meta_GetTableNames(string dbName = "")
{
var db =
DatabaseFactory.CreateDatabase(_DatabaseType,
_ConnectionString);
return db.meta_GetTableNames(dbName);
}
public DataTable meta_GetTableStru(string tableName)
{
var db =
DatabaseFactory.CreateDatabase(_DatabaseType,
_ConnectionString);
return db.meta_GetTableStru(tableName);
}
public DataTable meta_GetDatabase()
{
var db =
DatabaseFactory.CreateDatabase(_DatabaseType,
_ConnectionString);
return db.meta_GetDatabase();
}
public List meta_GetDatabaseList()
{
var db =
DatabaseFactory.CreateDatabase(_DatabaseType,
_ConnectionString);
return db.meta_GetDatabaseList();
}
public List meta_GetTableNamesList(string dbName = "")
{
var db =
DatabaseFactory.CreateDatabase(_DatabaseType,
_ConnectionString);
return db.meta_GetTableNamesList(dbName);
}
public List meta_GetTableStruList(string tableName)
{
var db =
DatabaseFactory.CreateDatabase(_DatabaseType,
_ConnectionString);
return db.meta_GetTableStruList(tableName);
}
public List meta_GetStoreProcList(
string dbName = "")
{
var db =
DatabaseFactory.CreateDatabase(_DatabaseType,
_ConnectionString);
return db.meta_GetStoreProcList(dbName);
}
public DataTable GetTable(DbCommand cmd, string tableName = "")
{
var dt = GetDataSet(cmd).Tables[0];
if (tableName != "") dt.TableName = tableName;
return dt;
}
public DataRow GetDataRow(string SQL)
{
var dt = GetDataSet(SQL).Tables[0];
return dt.Rows.Count > 0 ? dt.Rows[0] : null;
}
public int ExecuteSQL(string SQL)
{
DbConnection connection = null;
try
{
connection = CreateConnection();
return ExecuteSQL(SQL, connection);
}
finally
{
Close(connection);
}
}
public int ExecuteCommand(DbCommand cmd)
{
DbConnection connection = null;
try
{
if (cmd.Connection == null && cmd.Transaction == null)
cmd.Connection =
connection = CreateConnection(_ConnectionString);
return cmd.ExecuteNonQuery();
}
finally
{
if (cmd.Transaction == null) Close(connection);
}
}
public object ExecuteScalar(string SQL)
{
DbConnection connection = null;
DbCommand cmd = null;
try
{
connection = CreateConnection();
cmd = CreateCommand(connection, SQL);
return cmd.ExecuteScalar();
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (cmd != null) cmd.Dispose();
Close(connection);
}
}
public object ExecuteScalar(DbCommand cmd)
{
DbConnection connection = null;
try
{
if (cmd.Connection == null)
cmd.Connection = connection = CreateConnection();
return cmd.ExecuteScalar();
}
finally
{
Close(connection);
}
}
public DbDataReader ExecuteReader(string SQL)
{
DbConnection connection = null;
try
{
connection = CreateConnection();
return ExecuteReader(SQL, connection);
}
finally
{
Close(connection);
}
}
public DbDataReader ExecuteReader(DbCommand cmd)
{
DbConnection connection = null;
try
{
if (cmd.Connection == null) cmd.Connection = CreateConnection();
return cmd.ExecuteReader();
}
finally
{
Close(connection);
}
}
public T ExecuteReader(DbCommand cmd) where T : new()
{
DbConnection connection = null;
try
{
if (cmd.Connection == null) cmd.Connection = CreateConnection();
var obj = default(T);
using (var dataReader = cmd.ExecuteReader())
{
if (dataReader.Read())
obj = DbTools.Convert2Object(dataReader);
}
return obj;
}
finally
{
Close(connection);
}
}
public T ExecuteReader(string SQL) where T : new()
{
DbConnection connection = null;
DbCommand command = null;
DbDataReader dataReader = null;
try
{
using (connection = CreateConnection())
{
using (command = CreateCommand(SQL, CommandType.Text))
{
command.Connection = connection;
var obj = default(T);
using (dataReader = command.ExecuteReader())
{
if (dataReader.Read())
obj = DbTools.Convert2Object(dataReader);
}
return obj;
}
}
}
finally
{
if (connection != null) connection.Dispose();
if (command != null) command.Dispose();
if (dataReader != null) dataReader.Dispose();
}
}
public List ExecuteReader(string SQL,
Func action) where T : new()
{
DbConnection connection = null;
DbCommand command = null;
DbDataReader dataReader = null;
try
{
using (connection = CreateConnection())
{
using (command =
CreateCommand(connection, SQL, CommandType.Text))
{
var list = new List();
using (dataReader = command.ExecuteReader())
{
while (dataReader.Read())
list.Add(action.Invoke(dataReader));
}
return list;
}
}
}
finally
{
if (connection != null) connection.Dispose();
if (command != null) command.Dispose();
if (dataReader != null) dataReader.Dispose();
}
}
public List ExecuteReader(DbCommand cmd,
Func action) where T : new()
{
DbConnection connection = null;
try
{
if (cmd.Connection == null) cmd.Connection = CreateConnection();
var list = new List();
using (var dataReader = cmd.ExecuteReader())
{
while (dataReader.Read())
list.Add(action.Invoke(dataReader));
}
return list;
}
finally
{
Close(connection);
}
}
public List ExecuteReaderList(string SQL) where T : new()
{
DbConnection connection = null;
DbCommand command = null;
DbDataReader dataReader = null;
try
{
using (connection = CreateConnection())
{
using (command = CreateCommand(SQL, CommandType.Text))
{
command.Connection = connection;
var list = new List();
using (dataReader = command.ExecuteReader())
{
while (dataReader.Read())
list.Add(DbTools.Convert2Object(dataReader));
}
return list;
}
}
}
finally
{
if (connection != null) connection.Dispose();
if (command != null) command.Dispose();
if (dataReader != null) dataReader.Dispose();
}
}
public List ExecuteReaderList(DbCommand cmd) where T : new()
{
DbConnection connection = null;
try
{
if (cmd.Connection == null) cmd.Connection = CreateConnection();
var list = new List();
using (var dataReader = cmd.ExecuteReader())
{
while (dataReader.Read())
list.Add(DbTools.Convert2Object(dataReader));
}
return list;
}
finally
{
Close(connection);
}
}
public List GetStringList(string SQL)
{
DbConnection connection = null;
DbCommand command = null;
DbDataReader dataReader = null;
try
{
using (connection = CreateConnection())
{
using (command = CreateCommand(SQL, CommandType.Text))
{
command.Connection = connection;
var list = new List();
using (dataReader = command.ExecuteReader())
{
while (dataReader.Read())
list.Add(dataReader.GetValue(0)
.ToString()); //取第1列
}
return list;
}
}
}
finally
{
if (connection != null) connection.Dispose();
if (command != null) command.Dispose();
if (dataReader != null) dataReader.Dispose();
}
}
public List GetStringList(DbCommand cmd)
{
DbConnection connection = null;
try
{
if (cmd.Connection == null) cmd.Connection = CreateConnection();
var list = new List();
using (var dataReader = cmd.ExecuteReader())
{
while (dataReader.Read())
list.Add(dataReader.GetValue(0).ToString()); //取第1列
}
return list;
}
finally
{
Close(connection);
}
}
public void Close(DbConnection connection)
{
if (connection != null)
{
connection.Close();
connection.Dispose();
}
}
///
/// 在事务内提交数据
///
/// 事务
/// SQL语句
///
public int ExecuteTrans(DbTransaction trans, string SQL)
{
DbCommand cmd = null;
var i = -1;
try
{
cmd = DataProviderFactory.GetFactory(_DatabaseType)
.CreateCommand();
cmd.CommandText = CodeSafeHelper.GetSafeSQL(SQL);
cmd.CommandType = CommandType.Text;
cmd.Connection = trans.Connection;
cmd.Transaction = trans;
i = cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (cmd != null) cmd.Dispose();
}
return i;
}
public int ExecuteTrans(DbTransaction trans, DbCommand cmd)
{
var i = -1;
try
{
cmd.Connection = trans.Connection;
cmd.Transaction = trans;
i = cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (cmd != null) cmd.Dispose();
}
return i;
}
public DbType ToDbType(string sourceType)
{
if (_DatabaseType == DatabaseType.SqlServer)
return new DatabaseMSSQL("").ToDbType(sourceType);
if (_DatabaseType == DatabaseType.MySQL)
return new DatabaseMySQL("").ToDbType(sourceType);
if (_DatabaseType == DatabaseType.Oracle)
return new DatabaseOracle("").ToDbType(sourceType);
throw new Exception("数据库类型不支持!");
}
public Type ToNetType(string sourceType)
{
if (_DatabaseType == DatabaseType.SqlServer)
return new DatabaseMSSQL("").ToNetType(sourceType);
if (_DatabaseType == DatabaseType.MySQL)
return new DatabaseMySQL("").ToNetType(sourceType);
if (_DatabaseType == DatabaseType.Oracle)
return new DatabaseOracle("").ToNetType(sourceType);
throw new Exception("数据库类型不支持!");
}
///
/// 返回包含参数符号的参数名称,比如:@Code, :Code, ?p_Code
///
///
///
public string ParseParamName(string paramName)
{
var db =
DatabaseFactory.CreateDatabase(_DatabaseType,
_ConnectionString);
return db.ParseParamName(paramName);
}
///
/// 获取当前表最新(最大)的自增字段值
///
/// 表名
///
public int GetMaxID(string tableName)
{
var db =
DatabaseFactory.CreateDatabase(_DatabaseType,
_ConnectionString);
return db.GetMaxID(tableName);
}
public bool UpdateDataSet(DataTable ds, string tableName, string KEY)
{
//先删除原表数据
var sql = "";
var ErrorMsg = "";
foreach (DataRow dr in ds.Rows)
{
sql = string.Format(@"delete from {0} where {1} in ('{2}')",
tableName, KEY, dr[KEY]);
break;
}
var a = ExecuteSQL(sql);
var colMapping = new SqlBulkCopyColumnMapping[ds.Columns.Count];
for (var i = 0; i < ds.Columns.Count; i++)
colMapping[i] =
new SqlBulkCopyColumnMapping(ds.Columns[i].ColumnName,
ds.Columns[i].ColumnName);
// DataTableToSQLServer(ds, _ConnectionString, tableName, colMapping, ref ErrorMsg);
return true;
}
public bool InstDataSet(DataTable ds, string tableName)
{
//先删除原表数据
var ErrorMsg = "";
var colMapping = new SqlBulkCopyColumnMapping[ds.Columns.Count];
for (var i = 0; i < ds.Columns.Count; i++)
colMapping[i] =
new SqlBulkCopyColumnMapping(ds.Columns[i].ColumnName,
ds.Columns[i].ColumnName);
//DataTableToSQLServer(ds, _ConnectionString, tableName, colMapping, ref ErrorMsg);
return true;
}
public DbConnection CreateConnection(DatabaseType providerType,
string connectionString)
{
var DBConn = DataProviderFactory.GetFactory(providerType)
.CreateConnection();
DBConn.ConnectionString = connectionString;
DBConn.Open(); //打开连接
return DBConn;
}
public DbCommand CreateCommand(DbConnection conn, string SQL)
{
var cmd = DataProviderFactory.GetFactory(_DatabaseType)
.CreateCommand();
cmd.CommandText = CodeSafeHelper.GetSafeSQL(SQL);
cmd.CommandType = CommandType.Text;
cmd.Connection = conn;
cmd.CommandTimeout = CommandTimeout;
return cmd;
}
public DbCommand CreateCommand(DbConnection conn, string SQL,
CommandType type)
{
var cmd = DataProviderFactory.GetFactory(_DatabaseType)
.CreateCommand();
cmd.CommandText = CodeSafeHelper.GetSafeSQL(SQL);
cmd.CommandType = type;
cmd.Connection = conn;
cmd.CommandTimeout = CommandTimeout;
return cmd;
}
public DataSet GetDataSet(string SQL, DbConnection conn)
{
DbCommand cmd = null;
DbDataAdapter adapter = null;
try
{
cmd = DataProviderFactory.GetFactory(_DatabaseType)
.CreateCommand();
cmd.CommandText = CodeSafeHelper.GetSafeSQL(SQL);
cmd.CommandType = CommandType.Text;
cmd.Connection = conn;
var ds = new DataSet();
adapter = DataProviderFactory.GetFactory(_DatabaseType)
.CreateDataAdapter();
adapter.SelectCommand = cmd;
adapter.Fill(ds);
return ds;
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (adapter != null) adapter.Dispose();
if (cmd != null) cmd.Dispose();
}
}
public DataTable GetTable(string SQL, DbConnection conn)
{
return GetDataSet(SQL, conn).Tables[0];
}
public int ExecuteSQL(string SQL, DbConnection conn)
{
DbCommand cmd = null;
var i = -1;
try
{
cmd = DataProviderFactory.GetFactory(_DatabaseType)
.CreateCommand();
cmd.CommandText = CodeSafeHelper.GetSafeSQL(SQL);
cmd.CommandType = CommandType.Text;
cmd.Connection = conn;
i = cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (cmd != null) cmd.Dispose();
}
return i;
}
public object ExecuteScalar(string SQL, DbConnection conn)
{
DbCommand cmd = null;
object o = null;
try
{
cmd = DataProviderFactory.GetFactory(_DatabaseType)
.CreateCommand();
cmd.CommandText = CodeSafeHelper.GetSafeSQL(SQL);
cmd.CommandType = CommandType.Text;
cmd.Connection = conn;
o = cmd.ExecuteScalar();
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (cmd != null) cmd.Dispose();
}
return o;
}
public DbDataReader ExecuteReader(string SQL, DbConnection conn)
{
DbCommand cmd = null;
DbDataReader o = null;
try
{
cmd = DataProviderFactory.GetFactory(_DatabaseType)
.CreateCommand();
cmd.CommandText = CodeSafeHelper.GetSafeSQL(SQL);
cmd.CommandType = CommandType.Text;
cmd.Connection = conn;
o = cmd.ExecuteReader();
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (cmd != null) cmd.Dispose();
}
return o;
}
}
}