• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
西门吹雪
非我伤春春伤我,风一阵,雨一阵,好景不在哀残痕。 非我厌世世厌我,闲言来,碎语去,红颜憔悴心头冷。
博客园    首页    新随笔    联系   管理    订阅  订阅

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 已经提供了访问数据库的工厂模式
posted @ 2008-10-07 19:17  西门吹雪  阅读(2191)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3