1. 首先我們先來定義數據庫的類型
using System;
namespace UserLib.Database
{
///<summary>
///數據庫類型
///</summary>
public enum DatabaseType
{
OleDb, //OleDb 數據庫
SqlServer, //SqlServer 數據庫
Odbc, //Odbc 數據庫
}
}
2. 接着我們定義一個數據庫訪問的接口,提供通用的訪問方法
using System;
using System.Data;
using System.Data.Common;
namespace UserLib.Database
{
///<summary>
///數據庫通用接口
///</summary>
public interface IDatabase
{
///<summary>
///打開數據庫
///</summary>
///<param name="connString">連接字符串</param>
void Open(string connString);
///<summary>
///關閉數據庫
///</summary>
void Close();
///<summary>
///數據集
///</summary>
DataSet DataSetDB { get;}
///<summary>
///數據連接
///</summary>
DbConnection ConnectionDB { get;}
///<summary>
///獲取數據庫類型
///</summary>
///<returns>數據庫類型</returns>
DatabaseType GetDatabaseType();
///<summary>
///執行SQL語句
///</summary>
///<param name="sql">SQL語句</param>
///<returns>影響行數</returns>
int ExecuteSQL(string sql);
///<summary>
///執行SQL語句
///</summary>
///<param name="cmd">數據命令</param>
///<returns>影響行數</returns>
int ExecuteSQL(DbCommand cmd);
///<summary>
///執行SQL語句
///</summary>
///<param name="sql">SQL語句</param>
///<returns>第一行第一列值</returns>
object ExecuteSQLReturn(string sql);
///<summary>
///執行SQL語句
///</summary>
///<param name="cmd">數據命令</param>
///<returns>第一行第一列值</returns>
object ExecuteSQLReturn(DbCommand cmd);
///<summary>
///返回DataReader對象
///</summary>
///<param name="sql">SQL語句</param>
///<returns>DataReader對象</returns>
DbDataReader ReturnDataReader(string sql);
///<summary>
///返回DataReader對象
///</summary>
///<param name="cmd">查詢命令</param>
///<returns>DataReader對象</returns>
DbDataReader ReturnDataReader(DbCommand cmd);
///<summary>
///在數據集中加入有SQL語句生成的表
///</summary>
///<param name="sql">SQL語句</param>
///<param name="tbName">表名稱</param>
///<returns>數據集</returns>
DataSet AddTable(string sql, string tbName);
///<summary>
///在數據集中加入有SQL語句生成的表
///</summary>
///<param name="cmdSelect">查詢命令</param>
///<param name="tbName">表名稱</param>
///<returns>數據集</returns>
DataSet AddTable(DbCommand cmdSelect, string tbName);
///<summary>
///在數據集中加入有SQL語句生成的表
///</summary>
///<param name="sql">SQL語句</param>
///<param name="tbName">表名稱</param>
///<param name="da">導出數據適配器</param>
///<returns>數據集</returns>
DataSet AddTable(string sql, string tbName, out DbDataAdapter da);
///<summary>
///在數據集中加入有SQL語句生成的表
///</summary>
///<param name="cmdSelect">查詢命令</param>
///<param name="tbName">表名稱</param>
///<param name="da">導出數據適配器</param>
///<returns>數據集</returns>
DataSet AddTable(DbCommand cmdSelect, string tbName, out DbDataAdapter da);
///<summary>
///在數據集中加入有SQL語句生成的表
///</summary>
///<param name="da">數據適配器</param>
///<param name="tbName">表名稱</param>
///<returns>數據集</returns>
DataSet AddTable(DbDataAdapter da, string tbName);
///<summary>
///移除表
///</summary>
///<param name="tbName">表名稱</param>
void RemoveTable(string tbName);
///<summary>
///移除表
///</summary>
///<param name="index">表的索引</param>
void RemoveTable(int index);
///<summary>
///在數據集中加入關係
///</summary>
///<param name="name">關係名稱</param>
///<param name="prnTable">主表名稱</param>
///<param name="prnCol">主表中的列</param>
///<param name="chdTable">子表名稱</param>
///<param name="chdCol">子表中的列</param>
///<returns>數據集</returns>
DataSet AddRelation(string name, string prnTable, string prnCol, string chdTable, string chdCol);
///<summary>
///在數據集中加入關係
///</summary>
///<param name="name">關係名稱</param>
///<param name="prnTable">主表名稱</param>
///<param name="prnCol">主表中的列</param>
///<param name="chdTable">子表名稱</param>
///<param name="chdCol">子表中的列</param>
///<param name="dr">導出關係</param>
///<returns>數據集</returns>
DataSet AddRelation(string name, string prnTable, string prnCol, string chdTable, string chdCol, out DataRelation dr);
///<summary>
///在數據集中加入關係
///</summary>
///<param name="dr">關係</param>
///<returns>數據集</returns>
DataSet AddRelation(DataRelation dr);
///<summary>
///移除關係
///</summary>
///<param name="relationName">關係名稱</param>
void RemoveRelation(string relationName);
///<summary>
///移除關係
///</summary>
///<param name="index">關係索引</param>
void RemoveRelation(int index);
}
}
3. 接着我們實現IDatabase接口, 提供一個具體的數據庫訪問類
例: (Sql Server)
using System;
using System.Data;
using System.Data.Common;
using System.Data.SqlClient;
namespace UserLib.Database
{
///<summary>
/// SqlServer數據庫的連接與處理
///</summary>
public class SqlServer : IDatabase
{
private SqlConnection connDB; //Connection(連接) 對象
private DataSet dsDB = new DataSet(); //DataSet(數據集) 對象
///<summary>
///構造函數
///</summary>
public SqlServer() { }
///<summary>
///構造函數
///</summary>
///<param name="connString">連接字符串</param>
public SqlServer(string connString)
{
Open(connString);
}
///<summary>
///打開數據庫
///</summary>
///<param name="connString">連接字符串</param>
public void Open(string connString)
{
connDB = new SqlConnection(connString);
connDB.Open();
}
///<summary>
///關閉數據庫
///</summary>
public void Close()
{
connDB.Close();
}
///<summary>
///數據庫連接
///</summary>
public DbConnection ConnectionDB
{
get
{
return connDB;
}
}
///<summary>
///數據集
///</summary>
public DataSet DataSetDB
{
get
{
return dsDB;
}
}
///<summary>
///獲取數據庫類型
///</summary>
///<returns>數據庫類型</returns>
public DatabaseType GetDatabaseType()
{
return DatabaseType.SqlServer;
}
///<summary>
///執行SQL語句
///</summary>
///<param name="sql">SQL語句</param>
///<returns>影響行數</returns>
public int ExecuteSQL(string sql)
{
SqlCommand cmdDB = connDB.CreateCommand();
cmdDB.CommandText = sql;
int n = cmdDB.ExecuteNonQuery();
return n;
}
///<summary>
///執行SQL語句
///</summary>
///<param name="cmd">數據命令</param>
///<returns>影響行數</returns>
public int ExecuteSQL(DbCommand cmd)
{
SqlCommand cmdDB = new SqlCommand();
cmdDB = (SqlCommand)cmd;
int n = cmdDB.ExecuteNonQuery();
return n;
}
///<summary>
///執行SQL語句
///</summary>
///<param name="sql">SQL語句</param>
///<returns>第一行第一列值</returns>
public object ExecuteSQLReturn(string sql)
{
SqlCommand cmdDB = connDB.CreateCommand();
cmdDB.CommandText = sql;
object obj = cmdDB.ExecuteScalar();
return obj;
}
///<summary>
///執行SQL語句
///</summary>
///<param name="cmd">數據命令</param>
///<returns>第一行第一列值</returns>
public object ExecuteSQLReturn(DbCommand cmd)
{
SqlCommand cmdDB = new SqlCommand();
cmdDB = (SqlCommand)cmd;
object obj = cmdDB.ExecuteScalar();
return obj;
}
///<summary>
///返回DataReader對象
///</summary>
///<param name="sql">SQL語句</param>
///<returns>DataReader對象</returns>
public DbDataReader ReturnDataReader(string sql)
{
SqlCommand cmdDB = connDB.CreateCommand();
cmdDB.CommandText = sql;
return cmdDB.ExecuteReader();
}
///<summary>
///返回DataReader對象
///</summary>
///<param name="cmd">查詢命令</param>
///<returns>DataReader對象</returns>
public DbDataReader ReturnDataReader(DbCommand cmd)
{
SqlCommand cmdDB = new SqlCommand();
cmdDB = (SqlCommand)cmd;
return cmdDB.ExecuteReader();
}
///<summary>
///在數據集中加入有SQL語句生成的表
///</summary>
///<param name="sql">SQL語句</param>
///<param name="tbName">表名稱</param>
///<returns>數據集</returns>
public DataSet AddTable(string sql, string tbName)
{
SqlDataAdapter daTable = new SqlDataAdapter(sql, connDB);
//根據Select命令生成Insert Delete Update命令
SqlCommandBuilder cmdBuilder = new SqlCommandBuilder(daTable);
daTable.InsertCommand = cmdBuilder.GetInsertCommand();
daTable.DeleteCommand = cmdBuilder.GetDeleteCommand();
daTable.UpdateCommand = cmdBuilder.GetUpdateCommand();
//把數據庫中的鍵包含進來
daTable.MissingSchemaAction = MissingSchemaAction.AddWithKey;
daTable.Fill(dsDB, tbName);
return dsDB;
}
///<summary>
///在數據集中加入有SQL語句生成的表
///</summary>
///<param name="cmdSelect">查詢命令</param>
///<param name="tbName">表名稱</param>
///<returns>數據集</returns>
public DataSet AddTable(DbCommand cmdSelect, string tbName)
{
SqlDataAdapter daTable = new SqlDataAdapter((SqlCommand)cmdSelect);
//根據Select命令生成Insert Delete Update命令
SqlCommandBuilder cmdBuilder = new SqlCommandBuilder(daTable);
daTable.InsertCommand = cmdBuilder.GetInsertCommand();
daTable.DeleteCommand = cmdBuilder.GetDeleteCommand();
daTable.UpdateCommand = cmdBuilder.GetUpdateCommand();
//把數據庫中的鍵包含進來
daTable.MissingSchemaAction = MissingSchemaAction.AddWithKey;
daTable.Fill(dsDB, tbName);
return dsDB;
}
///<summary>
///在數據集中加入有SQL語句生成的表
///</summary>
///<param name="sql">SQL語句</param>
///<param name="tbName">表名稱</param>
///<param name="da">導出數據適配器</param>
///<returns>數據集</returns>
public DataSet AddTable(string sql, string tbName, out DbDataAdapter da)
{
SqlDataAdapter daTable = new SqlDataAdapter(sql, connDB);
//根據Select命令生成Insert Delete Update命令
SqlCommandBuilder cmdBuilder = new SqlCommandBuilder(daTable);
daTable.InsertCommand = cmdBuilder.GetInsertCommand();
daTable.DeleteCommand = cmdBuilder.GetDeleteCommand();
daTable.UpdateCommand = cmdBuilder.GetUpdateCommand();
//把數據庫中的鍵包含進來
daTable.MissingSchemaAction = MissingSchemaAction.AddWithKey;
da = daTable;
daTable.Fill(dsDB, tbName);
return dsDB;
}
///<summary>
///在數據集中加入有SQL語句生成的表
///</summary>
///<param name="cmdSelect">查詢命令</param>
///<param name="tbName">表名稱</param>
///<param name="da">導出數據適配器</param>
///<returns>數據集</returns>
public DataSet AddTable(DbCommand cmdSelect, string tbName, out DbDataAdapter da)
{
SqlDataAdapter daTable = new SqlDataAdapter((SqlCommand)cmdSelect);
//根據Select命令生成Insert Delete Update命令
SqlCommandBuilder cmdBuilder = new SqlCommandBuilder(daTable);
daTable.InsertCommand = cmdBuilder.GetInsertCommand();
daTable.DeleteCommand = cmdBuilder.GetDeleteCommand();
daTable.UpdateCommand = cmdBuilder.GetUpdateCommand();
//把數據庫中的鍵包含進來
daTable.MissingSchemaAction = MissingSchemaAction.AddWithKey;
da = daTable;
daTable.Fill(dsDB, tbName);
return dsDB;
}
///<summary>
///在數據集中加入有SQL語句生成的表
///</summary>
///<param name="da">數據適配器</param>
///<param name="tbName">表名稱</param>
///<returns>數據集</returns>
public DataSet AddTable(DbDataAdapter da, string tbName)
{
SqlDataAdapter daTable = new SqlDataAdapter();
daTable = (SqlDataAdapter)da;
//根據Select命令生成Insert Delete Update命令
SqlCommandBuilder cmdBuilder = new SqlCommandBuilder(daTable);
daTable.InsertCommand = cmdBuilder.GetInsertCommand();
daTable.DeleteCommand = cmdBuilder.GetDeleteCommand();
daTable.UpdateCommand = cmdBuilder.GetUpdateCommand();
//把數據庫中的鍵包含進來
daTable.MissingSchemaAction = MissingSchemaAction.AddWithKey;
daTable.Fill(dsDB, tbName);
return dsDB;
}
///<summary>
///移除表
///</summary>
///<param name="tbName">表名稱</param>
public void RemoveTable(string tbName)
{
dsDB.Tables.Remove(tbName);
}
///<summary>
///移除表
///</summary>
///<param name="index">表的索引</param>
public void RemoveTable(int index)
{
dsDB.Tables.RemoveAt(index);
}
///<summary>
///在數據集中加入關係
///</summary>
///<param name="name">關係名稱</param>
///<param name="prnTable">主表名稱</param>
///<param name="prnCol">主表中的列</param>
///<param name="chdTable">子表名稱</param>
///<param name="chdCol">子表中的列</param>
///<returns>數據集</returns>
public DataSet AddRelation(string name, string prnTable,string prnCol,string chdTable,string chdCol)
{
dsDB.Relations.Add(name, dsDB.Tables[prnTable].Columns[prnCol], dsDB.Tables[chdTable].Columns[chdCol]);
return dsDB;
}
///<summary>
///在數據集中加入關係
///</summary>
///<param name="name">關係名稱</param>
///<param name="prnTable">主表名稱</param>
///<param name="prnCol">主表中的列</param>
///<param name="chdTable">子表名稱</param>
///<param name="chdCol">子表中的列</param>
///<param name="dr">導出關係</param>
///<returns>數據集</returns>
public DataSet AddRelation(string name, string prnTable,string prnCol,string chdTable,string chdCol,out DataRelation dr)
{
DataRelation drTables = new DataRelation(name, dsDB.Tables[prnTable].Columns[prnCol], dsDB.Tables[chdTable].Columns[chdCol]);
dr = drTables;
dsDB.Relations.Add(drTables);
return dsDB;
}
///<summary>
///在數據集中加入關係
///</summary>
///<param name="dr">關係</param>
///<returns>數據集</returns>
public DataSet AddRelation(DataRelation dr)
{
dsDB.Relations.Add(dr);
return dsDB;
}
///<summary>
///移除關係
///</summary>
///<param name="relationName">關係名稱</param>
public void RemoveRelation(string relationName)
{
dsDB.Relations.Remove(relationName);
}
///<summary>
///移除關係
///</summary>
///<param name="index">關係索引</param>
public void RemoveRelation(int index)
{
dsDB.Relations.RemoveAt(index);
}
}
}
4. 最後定義數據庫工廠, 實現通用的數據庫訪問
using System;
using System.Data;
namespace UserLib.Database
{
///<summary>
///數據庫工廠
///</summary>
public class DBFactory
{
///<summary>
///私有構造函數
///</summary>
private DBFactory() { }
///<summary>
///將字符串轉成DatabaseType枚舉類型
///</summary>
///<param name="src">字符串</param>
///<returns>DatabaseType枚舉類型</returns>
private static DatabaseType ToDatabaseType(string src)
{
switch (src.ToLower())
{
case "oledb":
return DatabaseType.OleDb;
case "sqlserver":
return DatabaseType.SqlServer;
case "odbc":
return DatabaseType.Odbc;
default:
throw new Exception("類型不存在");
}
}
///<summary>
///創建數據庫類實例
///</summary>
///<param name="dbType">數據庫類型</param>
///<returns>數據庫類實例</returns>
public static IDatabase Create(DatabaseType dbType)
{
switch(dbType)
{
case DatabaseType.OleDb:
return new OleDb();
case DatabaseType.SqlServer:
return new SqlServer();
case DatabaseType.Odbc:
return new Odbc();
default:
return null;
}
}
///<summary>
///創建數據庫類實例
///</summary>
///<param name="dbType">數據庫類型</param>
///<returns>數據庫類實例</returns>
public static IDatabase Create(string dbType)
{
return Create(ToDatabaseType(dbType));
}
///<summary>
///創建數據庫類實例
///</summary>
///<param name="dbType">>數據庫類型</param>
///<param name="connString">數據庫連接字符串</param>
///<returns>數據庫類實例</returns>
public static IDatabase Create(DatabaseType dbType,string connString)
{
switch(dbType)
{
case DatabaseType.OleDb:
return new OleDb(connString);
case DatabaseType.SqlServer:
return new SqlServer(connString);
case DatabaseType.Odbc:
return new Odbc(connString);
default:
return null;
}
}
///<summary>
///創建數據庫類實例
///</summary>
///<param name="dbType">>數據庫類型</param>
///<param name="connString">數據庫連接字符串</param>
///<returns>數據庫類實例</returns>
public static IDatabase Create(string dbType, string connString)
{
return Create(ToDatabaseType(dbType), connString);
}
}
}
5. 用法
using System;
using UserLib.Database;
namespace Test
{
...
string ConnStr="...";
IDatabase db = DBFactory.Create(DatabaseType.SqlServer, ConnStr);
...
}
6. 備註
以上程序在.Net Framework 1.1 環境下編寫
.Net 2.0 已經提供了訪問數據庫的工廠模式