Oracle,SqlServer,Access資料庫通用訪問類設計(轉)
本專案除用到"實時資料庫"外, 還需要用Oracle資料庫儲存大量的配置資訊和生成的資料,而且對Oracle的讀取相當的頻繁,在專案開始之處,資料訪問就是一個很令人煩惱的問題,僅僅資料訪問類就修改了好多版本,直到目前正在使用的這個版本.同時為了應付開發過程中不時需要讀取SqlServer和Access資料庫,所以就寫成三種資料來源的通用訪問類,雖然有點四不象,不過挺省事的,嘻嘻!
此模組分為兩個CS檔案:
using System;
using System.Data;
using System.Data.Common;
using System.Data.SqlClient;
using System.Data.OleDb;
using System.Data.OracleClient;
using System.Collections;
namespace REAP.Utility
...{
public enum DataBaseType
...{
Access,
SQLServer,
Oracle
}
/**//// <summary>
/// DataFactory 的摘要說明。
/// </summary>
class DataFactory
...{
public DataFactory()
...{ }
public static IDbConnection CreateConnection(string ConnectionString, DataBaseType dbtype)
...{
IDbConnection cnn;
switch (dbtype)
...{
case DataBaseType.Access:
cnn = new OleDbConnection(ConnectionString);
break;
case DataBaseType.SQLServer:
cnn = new SqlConnection(ConnectionString);
break;
case DataBaseType.Oracle:
cnn = new OracleConnection(ConnectionString);
break;
default:
cnn = new SqlConnection(ConnectionString);
break;
}
return cnn;
}
public static IDbCommand CreateCommand(DataBaseType dbtype, IDbConnection cnn)
...{
IDbCommand cmd;
switch (dbtype)
...{
case DataBaseType.Access:
cmd = new OleDbCommand("", (OleDbConnection)cnn);
break;
case DataBaseType.SQLServer:
cmd = new SqlCommand("", (SqlConnection)cnn);
break;
case DataBaseType.Oracle:
cmd = new OracleCommand("", (OracleConnection)cnn);
break;
default:
cmd = new SqlCommand("", (SqlConnection)cnn);
break;
}
return cmd;
}
public static IDbCommand CreateCommand(string CommandText, DataBaseType dbtype, IDbConnection cnn)
...{
IDbCommand cmd;
switch (dbtype)
...{
case DataBaseType.Access:
cmd = new OleDbCommand(CommandText, (OleDbConnection)cnn);
break;
case DataBaseType.SQLServer:
cmd = new SqlCommand(CommandText, (SqlConnection)cnn);
break;
case DataBaseType.Oracle:
cmd = new OracleCommand(CommandText, (OracleConnection)cnn);
break;
default:
cmd = new SqlCommand(CommandText, (SqlConnection)cnn);
break;
}
return cmd;
}
public static DbDataAdapter CreateAdapter(IDbCommand cmd, DataBaseType dbtype)
...{
DbDataAdapter da;
switch (dbtype)
...{
case DataBaseType.Access:
da = new OleDbDataAdapter((OleDbCommand)cmd);
break;
case DataBaseType.SQLServer:
da = new SqlDataAdapter((SqlCommand)cmd);
break;
case DataBaseType.Oracle:
da = new OracleDataAdapter((OracleCommand)cmd);
break;
default:
da = new SqlDataAdapter((SqlCommand)cmd);
break;
}
return da;
}
public static IDataParameter CreateParameter(DataBaseType dbtype)
...{
IDataParameter param = null;
switch (dbtype)
...{
case DataBaseType.Access:
param = new OleDbParameter();
break;
case DataBaseType.SQLServer:
param = new SqlParameter();
break;
case DataBaseType.Oracle:
param = new OracleParameter();
break;
default:
param = new SqlParameter();
break;
}
return param;
}
}
}
using System.Data;
using System.Data.Common;
using System.Data.SqlClient;
using System.Data.OleDb;
using System.Data.OracleClient;
using System.Collections;
namespace REAP.Utility
...{
public enum DataBaseType
...{
Access,
SQLServer,
Oracle
}
/**//// <summary>
/// DataFactory 的摘要說明。
/// </summary>
class DataFactory
...{
public DataFactory()
...{ }
public static IDbConnection CreateConnection(string ConnectionString, DataBaseType dbtype)
...{
IDbConnection cnn;
switch (dbtype)
...{
case DataBaseType.Access:
cnn = new OleDbConnection(ConnectionString);
break;
case DataBaseType.SQLServer:
cnn = new SqlConnection(ConnectionString);
break;
case DataBaseType.Oracle:
cnn = new OracleConnection(ConnectionString);
break;
default:
cnn = new SqlConnection(ConnectionString);
break;
}
return cnn;
}
public static IDbCommand CreateCommand(DataBaseType dbtype, IDbConnection cnn)
...{
IDbCommand cmd;
switch (dbtype)
...{
case DataBaseType.Access:
cmd = new OleDbCommand("", (OleDbConnection)cnn);
break;
case DataBaseType.SQLServer:
cmd = new SqlCommand("", (SqlConnection)cnn);
break;
case DataBaseType.Oracle:
cmd = new OracleCommand("", (OracleConnection)cnn);
break;
default:
cmd = new SqlCommand("", (SqlConnection)cnn);
break;
}
return cmd;
}
public static IDbCommand CreateCommand(string CommandText, DataBaseType dbtype, IDbConnection cnn)
...{
IDbCommand cmd;
switch (dbtype)
...{
case DataBaseType.Access:
cmd = new OleDbCommand(CommandText, (OleDbConnection)cnn);
break;
case DataBaseType.SQLServer:
cmd = new SqlCommand(CommandText, (SqlConnection)cnn);
break;
case DataBaseType.Oracle:
cmd = new OracleCommand(CommandText, (OracleConnection)cnn);
break;
default:
cmd = new SqlCommand(CommandText, (SqlConnection)cnn);
break;
}
return cmd;
}
public static DbDataAdapter CreateAdapter(IDbCommand cmd, DataBaseType dbtype)
...{
DbDataAdapter da;
switch (dbtype)
...{
case DataBaseType.Access:
da = new OleDbDataAdapter((OleDbCommand)cmd);
break;
case DataBaseType.SQLServer:
da = new SqlDataAdapter((SqlCommand)cmd);
break;
case DataBaseType.Oracle:
da = new OracleDataAdapter((OracleCommand)cmd);
break;
default:
da = new SqlDataAdapter((SqlCommand)cmd);
break;
}
return da;
}
public static IDataParameter CreateParameter(DataBaseType dbtype)
...{
IDataParameter param = null;
switch (dbtype)
...{
case DataBaseType.Access:
param = new OleDbParameter();
break;
case DataBaseType.SQLServer:
param = new SqlParameter();
break;
case DataBaseType.Oracle:
param = new OracleParameter();
break;
default:
param = new SqlParameter();
break;
}
return param;
}
}
}
DBAccess.cs
using System;
using System.Data;
using System.Data.Common;
using System.Data.SqlClient;
using System.Data.OleDb;
using System.Data.OracleClient;
using System.Configuration;
namespace REAP.Utility
...{
/**//// <summary>
/// 由於可能會在多種資料來源,如ORACLE,SQLSERVER,ACCESS等之間進行切換,
/// 所以將資料來源連線字串和資料來源型別定義為類屬性,在預設情況下有配置檔案定義;
/// 當需要在兩種不同的資料來源之間進行切換時,可以重新為屬性賦值。
/// </summary>
public class DBAccess
...{
屬性設定#region 屬性設定
private string _ConnectionString = "";
private DataBaseType _DataSourceType = DataBaseType.Oracle;
/**//// <summary>
/// 資料來源連線字串
/// </summary>
public string ConnectionString
...{
get
...{
if (_ConnectionString == "")
...{
_ConnectionString = ConfigurationSettings.AppSettings["StrConn"];
}
return _ConnectionString;
}
set
...{
_ConnectionString = value;
}
}
/**//// <summary>
/// 資料庫庫型別(預設情況下為Oracle)
/// </summary>
public DataBaseType DataSourceType
...{
get
...{
return _DataSourceType;
}
set
...{
_DataSourceType = value;
}
}
public DBAccess()
...{}
#endregion
DataSet生成操作#region DataSet生成操作
/**//// <summary>
/// 根據SQL語句建立DataSet資料集;
/// 可以執行多條SELECT查詢語句,查詢語句之間用分號標記,如下所示:
/// SELECT * FROM TABLE1;SELECT * FROM TABLE2
/// </summary>
/// <param name="sqlQuery">SQL語句</param>
/// <returns>返回DataSet資料集</returns>
public DataSet GetDataSet(string sqlQuery)
...{
IDbConnection cn = DataFactory.CreateConnection( _ConnectionString, _DataSourceType );
IDbCommand cmd = null;
DbDataAdapter da = null;
DataSet dsResult = new DataSet();
try
...{
string[] strSqls = sqlQuery.Split(';');
foreach (string strSql in strSqls)
...{
cmd = DataFactory.CreateCommand(strSql, _DataSourceType, cn);
da = DataFactory.CreateAdapter(cmd, _DataSourceType);
DataSet ds = new DataSet();
da.Fill(ds);
if (strSqls.Length == 1)
...{
dsResult = ds;
}
else
...{
DataTable dt = ds.Tables[0].Clone();
foreach (DataRow dr in ds.Tables[0].Rows)
...{
dt.ImportRow(dr);
}
dsResult.Tables.Add(dt);
}
}
}
finally
...{
da.Dispose();
cmd.Dispose();
cn.Close();
cn.Dispose();
}
return dsResult;
}
/**//// <summary>
/// 執行SELECT查詢語句,並將結果以TABLE的形式加入到指定DataSet資料集;
/// 可以執行多條SELECT查詢語句,查詢語句之間用分號標記,如下所示:
/// SELECT * FROM TABLE1;SELECT * FROM TABLE2
/// </summary>
/// <param name="sqlQuery">SQL語句</param>
/// <param name="dsTarget">已存在的DataSet資料集</param>
/// <returns>返回DataSet資料集</returns>
public DataSet GetDataSet(string sqlQuery,DataSet dsTarget)
...{
IDbConnection cn = DataFactory.CreateConnection(_ConnectionString, _DataSourceType);
IDbCommand cmd = null;
DbDataAdapter da = null;
try
...{
string[] strSqls = sqlQuery.Split(';');
foreach (string strSql in strSqls)
...{
cmd = DataFactory.CreateCommand(strSql, _DataSourceType, cn);
da = DataFactory.CreateAdapter(cmd, _DataSourceType);
DataSet ds = new DataSet();
da.Fill(ds);
DataTable dt = ds.Tables[0].Clone();
foreach (DataRow dr in ds.Tables[0].Rows)
...{
dt.ImportRow(dr);
}
dsTarget.Tables.Add(dt);
}
}
finally
...{
da.Dispose();
cmd.Dispose();
cn.Close();
cn.Dispose();
}
return dsTarget;
}
#endregion
SQL執行操作#region SQL執行操作
/**//// <summary>
/// 根據SQL語句執行ExecuteNonQuery操作
/// </summary>
/// <param name="sqlQuery">SQL語句</param>
/// <returns>返回bool表示是否成功</returns>
public bool ExecuteNonQuery(string sqlQuery)
...{
IDbConnection cn = DataFactory.CreateConnection(_ConnectionString, _DataSourceType);
cn.Open();
IDbCommand cmd = DataFactory.CreateCommand(sqlQuery, _DataSourceType, cn);
try
...{
cmd.ExecuteNonQuery();
return true;
}
catch (Exception ex)
...{
string strEx = ex.Message;
return false;
}
finally
...{
cmd.Dispose();
cn.Close();
cn.Dispose();
}
}
#endregion
DataReader操作#region DataReader操作
/**//// <summary>
/// 根據SQL語句建立DataReader
/// </summary>
/// <param name="sqlQuery">SQL語句</param>
/// <returns>返回DataReader</returns>
public IDataReader GetDataReader(string sqlQuery)
...{
IDbConnection cn = DataFactory.CreateConnection(_ConnectionString, _DataSourceType);
IDbCommand cmd = DataFactory.CreateCommand(sqlQuery, _DataSourceType, cn);
IDataReader da = cmd.ExecuteReader(CommandBehavior.CloseConnection);
return da;
}
#endregion
//其他功能,故意省略
}
}
using System.Data;
using System.Data.Common;
using System.Data.SqlClient;
using System.Data.OleDb;
using System.Data.OracleClient;
using System.Configuration;
namespace REAP.Utility
...{
/**//// <summary>
/// 由於可能會在多種資料來源,如ORACLE,SQLSERVER,ACCESS等之間進行切換,
/// 所以將資料來源連線字串和資料來源型別定義為類屬性,在預設情況下有配置檔案定義;
/// 當需要在兩種不同的資料來源之間進行切換時,可以重新為屬性賦值。
/// </summary>
public class DBAccess
...{
屬性設定#region 屬性設定
private string _ConnectionString = "";
private DataBaseType _DataSourceType = DataBaseType.Oracle;
/**//// <summary>
/// 資料來源連線字串
/// </summary>
public string ConnectionString
...{
get
...{
if (_ConnectionString == "")
...{
_ConnectionString = ConfigurationSettings.AppSettings["StrConn"];
}
return _ConnectionString;
}
set
...{
_ConnectionString = value;
}
}
/**//// <summary>
/// 資料庫庫型別(預設情況下為Oracle)
/// </summary>
public DataBaseType DataSourceType
...{
get
...{
return _DataSourceType;
}
set
...{
_DataSourceType = value;
}
}
public DBAccess()
...{}
#endregion
DataSet生成操作#region DataSet生成操作
/**//// <summary>
/// 根據SQL語句建立DataSet資料集;
/// 可以執行多條SELECT查詢語句,查詢語句之間用分號標記,如下所示:
/// SELECT * FROM TABLE1;SELECT * FROM TABLE2
/// </summary>
/// <param name="sqlQuery">SQL語句</param>
/// <returns>返回DataSet資料集</returns>
public DataSet GetDataSet(string sqlQuery)
...{
IDbConnection cn = DataFactory.CreateConnection( _ConnectionString, _DataSourceType );
IDbCommand cmd = null;
DbDataAdapter da = null;
DataSet dsResult = new DataSet();
try
...{
string[] strSqls = sqlQuery.Split(';');
foreach (string strSql in strSqls)
...{
cmd = DataFactory.CreateCommand(strSql, _DataSourceType, cn);
da = DataFactory.CreateAdapter(cmd, _DataSourceType);
DataSet ds = new DataSet();
da.Fill(ds);
if (strSqls.Length == 1)
...{
dsResult = ds;
}
else
...{
DataTable dt = ds.Tables[0].Clone();
foreach (DataRow dr in ds.Tables[0].Rows)
...{
dt.ImportRow(dr);
}
dsResult.Tables.Add(dt);
}
}
}
finally
...{
da.Dispose();
cmd.Dispose();
cn.Close();
cn.Dispose();
}
return dsResult;
}
/**//// <summary>
/// 執行SELECT查詢語句,並將結果以TABLE的形式加入到指定DataSet資料集;
/// 可以執行多條SELECT查詢語句,查詢語句之間用分號標記,如下所示:
/// SELECT * FROM TABLE1;SELECT * FROM TABLE2
/// </summary>
/// <param name="sqlQuery">SQL語句</param>
/// <param name="dsTarget">已存在的DataSet資料集</param>
/// <returns>返回DataSet資料集</returns>
public DataSet GetDataSet(string sqlQuery,DataSet dsTarget)
...{
IDbConnection cn = DataFactory.CreateConnection(_ConnectionString, _DataSourceType);
IDbCommand cmd = null;
DbDataAdapter da = null;
try
...{
string[] strSqls = sqlQuery.Split(';');
foreach (string strSql in strSqls)
...{
cmd = DataFactory.CreateCommand(strSql, _DataSourceType, cn);
da = DataFactory.CreateAdapter(cmd, _DataSourceType);
DataSet ds = new DataSet();
da.Fill(ds);
DataTable dt = ds.Tables[0].Clone();
foreach (DataRow dr in ds.Tables[0].Rows)
...{
dt.ImportRow(dr);
}
dsTarget.Tables.Add(dt);
}
}
finally
...{
da.Dispose();
cmd.Dispose();
cn.Close();
cn.Dispose();
}
return dsTarget;
}
#endregion
SQL執行操作#region SQL執行操作
/**//// <summary>
/// 根據SQL語句執行ExecuteNonQuery操作
/// </summary>
/// <param name="sqlQuery">SQL語句</param>
/// <returns>返回bool表示是否成功</returns>
public bool ExecuteNonQuery(string sqlQuery)
...{
IDbConnection cn = DataFactory.CreateConnection(_ConnectionString, _DataSourceType);
cn.Open();
IDbCommand cmd = DataFactory.CreateCommand(sqlQuery, _DataSourceType, cn);
try
...{
cmd.ExecuteNonQuery();
return true;
}
catch (Exception ex)
...{
string strEx = ex.Message;
return false;
}
finally
...{
cmd.Dispose();
cn.Close();
cn.Dispose();
}
}
#endregion
DataReader操作#region DataReader操作
/**//// <summary>
/// 根據SQL語句建立DataReader
/// </summary>
/// <param name="sqlQuery">SQL語句</param>
/// <returns>返回DataReader</returns>
public IDataReader GetDataReader(string sqlQuery)
...{
IDbConnection cn = DataFactory.CreateConnection(_ConnectionString, _DataSourceType);
IDbCommand cmd = DataFactory.CreateCommand(sqlQuery, _DataSourceType, cn);
IDataReader da = cmd.ExecuteReader(CommandBehavior.CloseConnection);
return da;
}
#endregion
//其他功能,故意省略
}
}
舉例如下:
預設情況下是訪問Oracle資料庫,資料庫連線字串已經在Config檔案中定義,所以不需要再設定其ConnectionString和DataSourceType屬性,此時返回一個DataSet的程式碼如下:
DBAccess db = new DBAccess();
//同時執行兩條查詢語句
string strSql = "SELECT * FROM TABLE1;SELECT * FROM TABLE2";
DataSet ds = db.GetDataSet(strSql);
//同時執行兩條查詢語句
string strSql = "SELECT * FROM TABLE1;SELECT * FROM TABLE2";
DataSet ds = db.GetDataSet(strSql);
但是如果在程式中需要臨時訪問SqlServer資料庫,則需要設定屬性,此時程式碼如下:
DBAccess db = new DBAccess();
db.ConnectionString = "server=localhost;UID=sa;PWD=123456;DATABASE=Money;connect timeout=120";
db.DataSourceType = DataBaseType.SQLServer;
db.ConnectionString = "server=localhost;UID=sa;PWD=123456;DATABASE=Money;connect timeout=120";
db.DataSourceType = DataBaseType.SQLServer;
(完)
相關文章
- Oracle透明閘道器訪問SQLServer資料庫OracleSQLServer資料庫
- PHP設計模式-DAO (Data Access Objects) 資料訪問物件模式PHP設計模式Object物件
- oracle和sqlserver互訪(轉)OracleSQLServer
- Oracle資料庫限制訪問IPOracle資料庫
- Access 匯入 oracle 資料庫Oracle資料庫
- Holer實現外網訪問SQLServer資料庫SQLServer資料庫
- 如何限制ip訪問Oracle資料庫Oracle資料庫
- sqlserver讀取oracle資料庫資料SQLServerOracle資料庫
- Oracle透明閘道器訪問MySQL資料庫OracleMySql資料庫
- Sqlserver限制賬戶在哪些ip下才可以訪問資料庫SQLServer資料庫
- 資料庫選型比對 Oracle vs sqlserver資料庫OracleSQLServer
- 【磐維資料庫】Oracle(透明閘道器)訪問磐維資料庫(PanWeiDB)資料庫Oracle
- JDBC資料庫訪問JDBC資料庫
- Oracle DBLink跨資料庫訪問SQL server資料同步 踩坑實錄Oracle資料庫SQLServer
- Access資料庫日常維護和Access資料庫最佳化方法資料庫
- Oracle資料庫連結(DBLink)中如何訪問包含BLOB欄位的資料Oracle資料庫
- 通用許可權系統之資料庫表設計資料庫
- 【資料庫設計】資料庫的設計資料庫
- 外網訪問MySQL資料庫MySql資料庫
- 做資料庫分離讀寫時,sqlServer資料庫資料同步的問題:資料庫SQLServer
- SqlServer資料庫中文亂碼問題解決SQLServer資料庫
- 如何處理Oracle資料庫中的壞塊問題(轉)Oracle資料庫
- PHP 連線access資料庫PHP資料庫
- C# 操作 access 資料庫C#資料庫
- Oracle資料庫關於SQL的執行計劃(轉)Oracle資料庫SQL
- Serverless 解惑——函式計算如何訪問 Redis 資料庫Server函式Redis資料庫
- Serverless 解惑——函式計算如何訪問 Mongo 資料庫Server函式Go資料庫
- Serverless 解惑——函式計算如何訪問 MySQL 資料庫Server函式MySql資料庫
- Serverless 解惑——函式計算如何訪問 PostgreSQL 資料庫Server函式SQL資料庫
- Oracle如何診斷遠端訪問資料庫慢/超時等問題小結Oracle資料庫
- SQLServer批量新增資料庫SQLServer資料庫
- 外網訪問本地sqlserverSQLServer
- Oracle資料庫表設計時的注意事項Oracle資料庫
- Oracle DG資料庫狀態轉換Oracle資料庫
- Oracle資料庫日期格式轉換操作Oracle資料庫
- 使用 @NoRepositoryBean 簡化資料庫訪問Bean資料庫
- jmeter 使用 ssh 方式訪問資料庫JMeter資料庫
- oracle 12C以上 版本資料庫訪問 ORA-28040 ORA-03134Oracle資料庫
- Oracle資料訪問元件ODAC的安裝方法Oracle元件