C#中数据库的访问(工厂模式)
1. 首先我们先来定义数据库的类型
using System;
namespace UserLib.Database
{
///
///数据库类型
///
public enum DatabaseType
{
OleDb, //OleDb 数据库
SqlServer, //SqlServer 数据库
Odbc, //Odbc 数据库
}
}
2. 接着我们定义一个数据库访问的接口,提供通用的访问方法
using System;
using System.Data;
using System.Data.Common;
namespace UserLib.Database
{
///
///数据库通用接口
///
public interface IDatabase
{
///
///打开数据库
///
///连接字符串
void Open(string connString);
///
///关闭数据库
///
void Close();
///
///数据集
///
DataSet DataSetDB { get;}
///
///数据连接
///
DbConnection ConnectionDB { get;}
///
///获取数据库类型
///
///数据库类型
DatabaseType GetDatabaseType();
///
///执行SQL语句
///
///SQL语句
///影响行数
int ExecuteSQL(string sql);
///
///执行SQL语句
///
///数据命令
///影响行数
int ExecuteSQL(DbCommand cmd);
///
///执行SQL语句
///
///SQL语句
///第一行第一列值
object ExecuteSQLReturn(string sql);
///
///执行SQL语句
///
///数据命令
///第一行第一列值
object ExecuteSQLReturn(DbCommand cmd);
///
///返回DataReader对象
///
///SQL语句
///DataReader对象
DbDataReader ReturnDataReader(string sql);
///
///返回DataReader对象
///
///查询命令
///DataReader对象
DbDataReader ReturnDataReader(DbCommand cmd);
///
///在数据集中加入有SQL语句生成的表
///
///SQL语句
///表名称
///数据集
DataSet AddTable(string sql, string tbName);
///
///在数据集中加入有SQL语句生成的表
///
///查询命令
///表名称
///数据集
DataSet AddTable(DbCommand cmdSelect, string tbName);
///
///在数据集中加入有SQL语句生成的表
///
///SQL语句
///表名称
///导出数据适配器
///数据集
DataSet AddTable(string sql, string tbName, out DbDataAdapter da);
///
///在数据集中加入有SQL语句生成的表
///
///查询命令
///表名称
///导出数据适配器
///数据集
DataSet AddTable(DbCommand cmdSelect, string tbName, out DbDataAdapter da);
///
///在数据集中加入有SQL语句生成的表
///
///数据适配器
///表名称
///数据集
DataSet AddTable(DbDataAdapter da, string tbName);
///
///移除表
///
///表名称
void RemoveTable(string tbName);
///
///移除表
///
///表的索引
void RemoveTable(int index);
///
///在数据集中加入关系
///
///关系名称
///主表名称
///主表中的列
///子表名称
///子表中的列
///数据集
DataSet AddRelation(string name, string prnTable, string prnCol, string chdTable, string chdCol);
///
///在数据集中加入关系
///
///关系名称
///主表名称
///主表中的列
///子表名称
///子表中的列
///导出关系
///数据集
DataSet AddRelation(string name, string prnTable, string prnCol, string chdTable, string chdCol, out DataRelation dr);
///
///在数据集中加入关系
///
///关系
///数据集
DataSet AddRelation(DataRelation dr);
///
///移除关系
///
///关系名称
void RemoveRelation(string relationName);
///
///移除关系
///
///关系索引
void RemoveRelation(int index);
}
}
3. 接着我们实现IDatabase接口, 提供一个具体的数据库访问类
例: (Sql Server)
using System;
using System.Data;
using System.Data.Common;
using System.Data.SqlClient;
namespace UserLib.Database
{
///
/// SqlServer数据库的连接与处理
///
public class SqlServer : IDatabase
{
private SqlConnection connDB; //Connection(连接) 对象
private DataSet dsDB = new DataSet(); //DataSet(数据集) 对象
///
///构造函数
///
public SqlServer() { }
///
///构造函数
///
///连接字符串
public SqlServer(string connString)
{
Open(connString);
}
///
///打开数据库
///
///连接字符串
public void Open(string connString)
{
connDB = new SqlConnection(connString);
connDB.Open();
}
///
///关闭数据库
///
public void Close()
{
connDB.Close();
}
///
///数据库连接
///
public DbConnection ConnectionDB
{
get
{
return connDB;
}
}
///
///数据集
///
public DataSet DataSetDB
{
get
{
return dsDB;
}
}
///
///获取数据库类型
///
///数据库类型
public DatabaseType GetDatabaseType()
{
return DatabaseType.SqlServer;
}
///
///执行SQL语句
///
///SQL语句
///影响行数
public int ExecuteSQL(string sql)
{
SqlCommand cmdDB = connDB.CreateCommand();
cmdDB.CommandText = sql;
int n = cmdDB.ExecuteNonQuery();
return n;
}
///
///执行SQL语句
///
///数据命令
///影响行数
public int ExecuteSQL(DbCommand cmd)
{
SqlCommand cmdDB = new SqlCommand();
cmdDB = (SqlCommand)cmd;
int n = cmdDB.ExecuteNonQuery();
return n;
}
///
///执行SQL语句
///
///SQL语句
///第一行第一列值
public object ExecuteSQLReturn(string sql)
{
SqlCommand cmdDB = connDB.CreateCommand();
cmdDB.CommandText = sql;
object obj = cmdDB.ExecuteScalar();
return obj;
}
///
///执行SQL语句
///
///数据命令
///第一行第一列值
public object ExecuteSQLReturn(DbCommand cmd)
{
SqlCommand cmdDB = new SqlCommand();
cmdDB = (SqlCommand)cmd;
object obj = cmdDB.ExecuteScalar();
return obj;
}
///
///返回DataReader对象
///
///SQL语句
///DataReader对象
public DbDataReader ReturnDataReader(string sql)
{
SqlCommand cmdDB = connDB.CreateCommand();
cmdDB.CommandText = sql;
return cmdDB.ExecuteReader();
}
///
///返回DataReader对象
///
///查询命令
///DataReader对象
public DbDataReader ReturnDataReader(DbCommand cmd)
{
SqlCommand cmdDB = new SqlCommand();
cmdDB = (SqlCommand)cmd;
return cmdDB.ExecuteReader();
}
///
///在数据集中加入有SQL语句生成的表
///
///SQL语句
///表名称
///数据集
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;
}
///
///在数据集中加入有SQL语句生成的表
///
///查询命令
///表名称
///数据集
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;
}
///
///在数据集中加入有SQL语句生成的表
///
///SQL语句
///表名称
///导出数据适配器
///数据集
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;
}
///
///在数据集中加入有SQL语句生成的表
///
///查询命令
///表名称
///导出数据适配器
///数据集
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;
}
///
///在数据集中加入有SQL语句生成的表
///
///数据适配器
///表名称
///数据集
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;
}
///
///移除表
///
///表名称
public void RemoveTable(string tbName)
{
dsDB.Tables.Remove(tbName);
}
///
///移除表
///
///表的索引
public void RemoveTable(int index)
{
dsDB.Tables.RemoveAt(index);
}
///
///在数据集中加入关系
///
///关系名称
///主表名称
///主表中的列
///子表名称
///子表中的列
///数据集
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;
}
///
///在数据集中加入关系
///
///关系名称
///主表名称
///主表中的列
///子表名称
///子表中的列
///导出关系
///数据集
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;
}
///
///在数据集中加入关系
///
///关系
///数据集
public DataSet AddRelation(DataRelation dr)
{
dsDB.Relations.Add(dr);
return dsDB;
}
///
///移除关系
///
///关系名称
public void RemoveRelation(string relationName)
{
dsDB.Relations.Remove(relationName);
}
///
///移除关系
///
///关系索引
public void RemoveRelation(int index)
{
dsDB.Relations.RemoveAt(index);
}
}
}
4. 最后定义数据库工厂, 实现通用的数据库访问
using System;
using System.Data;
namespace UserLib.Database
{
///
///数据库工厂
///
public class DBFactory
{
///
///私有构造函数
///
private DBFactory() { }
///
///将字符串转成DatabaseType枚举类型
///
///字符串
///DatabaseType枚举类型
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("类型不存在");
}
}
///
///创建数据库类实例
///
///数据库类型
///数据库类实例
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;
}
}
///
///创建数据库类实例
///
///数据库类型
///数据库类实例
public static IDatabase Create(string dbType)
{
return Create(ToDatabaseType(dbType));
}
///
///创建数据库类实例
///
///>数据库类型
///数据库连接字符串
///数据库类实例
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;
}
}
///
///创建数据库类实例
///
///>数据库类型
///数据库连接字符串
///数据库类实例
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 已经提供了访问数据库的工厂模式