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;
(完)
相關文章
- 使用設計模式構建通用資料庫訪問類 (轉)設計模式資料庫
- 【ASP.NET開發】ASP.NET對SQLServer的通用資料庫訪問類ASP.NETSQLServer資料庫
- Oracle透明閘道器訪問SQLServer資料庫OracleSQLServer資料庫
- [轉]SQLServer跨伺服器訪問資料庫(openrowset/opendatasource/openquery)SQLServer伺服器資料庫ENQ
- 如何限定IP訪問Oracle資料庫-轉Oracle資料庫
- PHP設計模式-DAO (Data Access Objects) 資料訪問物件模式PHP設計模式Object物件
- 寫一個通用資料訪問元件 (轉)元件
- Holer實現外網訪問SQLServer資料庫SQLServer資料庫
- Oracle資料庫訪問控制Oracle資料庫
- 使用ADO,多執行緒訪問ACCESS資料庫的開發。 (轉)執行緒資料庫
- 請教高手門:如何遠端訪問Access資料庫?資料庫
- Oracle資料庫限制訪問IPOracle資料庫
- 用設計模式開發通用資料庫操作器 (轉)設計模式資料庫
- 封裝ADO訪問資料庫的兩個類 (轉)封裝資料庫
- Access 匯入 oracle 資料庫Oracle資料庫
- 非Access資料庫在VB的程式設計及應用 (轉)資料庫程式設計
- oracle和sqlserver互訪(轉)OracleSQLServer
- c#訪問oracle幾種方法(轉載)_data accessC#Oracle
- 如何限制ip訪問Oracle資料庫Oracle資料庫
- Oracle資料庫訪問效能優化Oracle資料庫優化
- VC的另類資料庫程式設計(轉)資料庫程式設計
- 用perl訪問mysql資料庫(轉)MySql資料庫
- 遠端資料庫的訪問 (轉)資料庫
- 透過socket訪問資料庫(轉)資料庫
- JSP訪問資料庫大全(轉)JS資料庫
- MySql資料庫C++訪問(轉)MySql資料庫C++
- sqlserver讀取oracle資料庫資料SQLServerOracle資料庫
- 釋出一個.NET資料庫訪問類資料庫
- C# SQLite資料庫 訪問封裝類C#SQLite資料庫封裝
- C#的Access資料庫操作 AccessHelper類C#資料庫
- 【方法】如何限定IP訪問Oracle資料庫Oracle資料庫
- 禁止某個IP訪問Oracle資料庫Oracle資料庫
- Sqlserver限制賬戶在哪些ip下才可以訪問資料庫SQLServer資料庫
- Applet直接訪問資料庫 (轉)APP資料庫
- 用JDBC訪問一個資料庫(轉)JDBC資料庫
- Access資料庫審計工具mdbtools資料庫
- C#:資料庫SQL操作通用類C#資料庫SQL
- 設定oracle資料庫IP訪問限制(IP白名單黑名單)Oracle資料庫