一、数据源连接实体类;
/// <summary>
/// 数据源信息
/// </summary>
public class DataSourceInfo
{
/// <summary>
/// 数据源类型
/// </summary>
public DataSourceType DataSourceType { get; set; }
/// <summary>
/// 服务器
/// </summary>
public string Host { get; set; }
/// <summary>
/// 端口号
/// </summary>
public string Port { get; set; }
/// <summary>
/// 用户ID
/// </summary>
public string UserId { get; set; }
/// <summary>
/// 密码
/// </summary>
public string Password { get; set; }
/// <summary>
/// 数据库
/// </summary>
public string Database { get; set; }
}
二、构造多数据库连接
/// <summary>
/// 多数据库数据访问
/// </summary>
public class MultiDbDal
{
/// <summary>
/// 各类数据库对应的常量信息
/// </summary>
public static readonly Dictionary<DataSourceType, DataSourceConstInfo> TypeDicConnectStringFormat = new Dictionary<DataSourceType, DataSourceConstInfo>()
{
{DataSourceType.MySql,new DataSourceConstInfo()
{
DefaultPort ="3306",
Provider = "MySql.Data.MySqlClient",
ValidSqlText = "select 1",
FormatConnectingString = "Server={0};Port={1};Database={2};Uid={3};Pwd={4};"
} },
{DataSourceType.SqlServer,new DataSourceConstInfo()
{
//SqlServer也有默认端口1433,但是连接字符串不需要
DefaultPort =string.Empty,
Provider = "System.Data.SqlClient",
ValidSqlText = "select 1",
FormatConnectingString = "Server={0};Database={1};User Id={2};Password={3};;"
} },
{DataSourceType.Oracle,new DataSourceConstInfo()
{
DefaultPort ="1521",
Provider = "Oracle.DataAccess.Client",
ValidSqlText = "select 1 from dual",
FormatConnectingString = "Provider=OraOLEDB.Oracle;User ID={3};Password={4};Data Source=(DESCRIPTION = (ADDRESS_LIST= (ADDRESS = (PROTOCOL = TCP)(HOST = {0})(PORT = {1}))) (CONNECT_DATA = (SERVICE_NAME = {2})))"
} }
//{DataSourceType.Oracle,new DataSourceConstInfo()
//{
// DefaultPort ="1521",
// Provider = "Oracle.DataAccess.Client",
// ValidSqlText = "select 1 from dual",
// FormatConnectingString = "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST={0})(PORT={1}))(CONNECT_DATA=(SERVICE_NAME={2})));User Id={3};Password={4};"
//}
};
/// <summary>
///
/// </summary>
public DataSourceInfo DataSourceInfo { get; set; }
public MultiDbDal(DataSourceInfo dataSourceInfo)
{
if (dataSourceInfo == null)
{
throw new ArgumentNullException(nameof(dataSourceInfo));
}
//标准连接:服务器 数据库 用户名 密码 必须要; 如果是windows登录后续再扩展
if (String.IsNullOrWhiteSpace(dataSourceInfo.Host))
{
throw new ArgumentNullException(nameof(dataSourceInfo.Host));
}
if (String.IsNullOrWhiteSpace(dataSourceInfo.Database))
{
throw new ArgumentNullException(nameof(dataSourceInfo.Database));
}
if (String.IsNullOrWhiteSpace(dataSourceInfo.UserId))
{
throw new ArgumentNullException(nameof(dataSourceInfo.UserId));
}
if (String.IsNullOrWhiteSpace(dataSourceInfo.Password))
{
throw new ArgumentNullException(nameof(dataSourceInfo.Password));
}
DataSourceInfo = dataSourceInfo;
}
/// <summary>
/// 构造连接字符串
/// </summary>
/// <returns></returns>
private string BuilderConnectionString()
{
var result = string.Empty;
DataSourceConstInfo dataConst;
if (TypeDicConnectStringFormat.TryGetValue(DataSourceInfo.DataSourceType, out dataConst))
{
var port = string.IsNullOrWhiteSpace(DataSourceInfo.Port) ? dataConst.DefaultPort : DataSourceInfo.Port;
var server = DataSourceInfo.Host;
var pwd = TripleDESHelper.Decrypt(DataSourceInfo.Password, "Mysoft123456");
if (DataSourceInfo.DataSourceType == DataSourceType.SqlServer)
{
//SqlServer只有4个参数
if (string.IsNullOrWhiteSpace(port) == false)
{
server += $",{port}";
}
result = string.Format(dataConst.FormatConnectingString, server, DataSourceInfo.Database,
DataSourceInfo.UserId, pwd);
}
else
{
result = string.Format(dataConst.FormatConnectingString, server, port, DataSourceInfo.Database,
DataSourceInfo.UserId, pwd);
}
}
return result;
}
/// <summary>
/// 是否连接成功,返回值为空则表示成功,如果有错误信息则表示连接失败
/// </summary>
/// <returns></returns>
public string IsConnectSuccess()
{
var result = String.Empty;
DataSourceConstInfo dataConst;
if (TypeDicConnectStringFormat.TryGetValue(DataSourceInfo.DataSourceType, out dataConst))
{
try
{
//Query(dataConst.ValidSqlText, dataSourceInfo);
}
catch /* 测试连接的需要抓取异常*/(Exception exception)
{
result = exception.Message;
}
}
return result;
}
/// <summary>
///
/// </summary>
/// <param name="sqlText"></param>
public DataTable QueryDataTable(string sqlText)
{
var connectionString = BuilderConnectionString();
switch (DataSourceInfo.DataSourceType)
{
case DataSourceType.MySql:
return MysqlQueryDataTable(sqlText, connectionString);
case DataSourceType.Oracle:
return OracleQueryDataTable(sqlText, connectionString);
case DataSourceType.SqlServer:
return SqlServerQueryDataTable(sqlText, connectionString);
default:
throw new ArgumentException(nameof(DataSourceInfo.DataSourceType));
}
}
/// <summary>
/// Mysql查询数据
/// </summary>
/// <param name="sqlText"></param>
/// <param name="connectionString"></param>
/// <returns></returns>
private DataTable MysqlQueryDataTable(string sqlText, string connectionString)
{
DataSet dataset = new DataSet();
using (MySqlConnection con = new MySqlConnection(connectionString))
{
con.Open();
using (MySqlCommand cmd = new MySqlCommand(sqlText, con))
{
MySqlDataAdapter adapter = new MySqlDataAdapter(cmd);
adapter.Fill(dataset);
}
}
return dataset.Tables[0];
}
/// <summary>
/// sqlServer查询数据
/// </summary>
/// <param name="sqlText"></param>
/// <param name="connectionString"></param>
/// <returns></returns>
private DataTable SqlServerQueryDataTable(string sqlText, string connectionString)
{
DataSet dataset = new DataSet();
using (SqlConnection con = new SqlConnection(connectionString))
{
con.Open();
using (SqlCommand cmd = new SqlCommand(sqlText, con))
{
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
adapter.Fill(dataset);
}
}
return dataset.Tables[0];
}
/// <summary>
/// Oracle 查询数据
/// </summary>
/// <param name="sqlText"></param>
/// <param name="connectionString"></param>
/// <returns></returns>
private DataTable OracleQueryDataTable(string sqlText, string connectionString)
{
DataSet dataset = new DataSet();
using (OleDbConnection con = new OleDbConnection(connectionString))
{
con.Open();
using (OleDbCommand cmd = new OleDbCommand(sqlText, con))
{
OleDbDataAdapter adapter = new OleDbDataAdapter(cmd);
adapter.Fill(dataset);
}
}
return dataset.Tables[0];
}
///// <summary>
///// Oracle 查询数据
///// </summary>
///// <param name="sqlText"></param>
///// <param name="connectionString"></param>
///// <returns></returns>
//private DataTable OracleQueryDataTable(string sqlText, string connectionString)
//{
// DataSet dataset = new DataSet();
// using (OracleConnection con = new OracleConnection(connectionString))
// {
// con.Open();
// using (OracleCommand cmd = new OracleCommand(sqlText, con))
// {
// OracleDataAdapter adapter = new OracleDataAdapter(cmd);
// adapter.Fill(dataset);
// }
// }
// return dataset.Tables[0];
//}
}
PS: oracle 开始选择了OracleClient, 后面发现它有64位和32位之分,但是自己的工程是anyCpu。那么问题来了,如果在引的64位dll,就只能在64位环境运行了,32位同理;
以上只是一个查询的实例,如果可以,最好实现多个helper来执行对应的数据库操作。