.NET数据库编程求索之路--7.使用ADO.NET实现(工厂模式-实现多数据库切换)(1)

简介: 7.使用ADO.NET实现(工厂模式-实现多数据库切换)(1)     7.1 解决方案框架 解决方案(.sln)包含以下几个项目: (1)类库项目HomeShop.DbUtility,数据访问实用工具; (2)类库项目HomeShop.

7.使用ADO.NET实现(工厂模式-实现多数据库切换)(1)

 

 

7.1 解决方案框架

解决方案(.sln)包含以下几个项目:

(1)类库项目HomeShop.DbUtility,数据访问实用工具;

(2)类库项目HomeShop.Model,实体层;【同5】

(3)类库项目HomeShop.DALFactory,数据访问层工厂;

(4)类库项目HomeShop.DALInterface,数据访问层接口;

(5)类库项目HomeShop.DALOfSql,SQLServer数据访问层;

(6)类库项目HomeShop.DALOfAccess,Access数据访问层;

(4)类库项目HomeShop.BLL,业务逻辑层;

(5)WinForm项目HomeShop.WinForm,界面层。

 

 7.2 数据访问实用工具HomeShop.DbUtility

 

SqlDbHelper.cs

img_405b18b4b6584ae338e0f6ecaf736533.gif View Code
  1  using System;
  2  using System.Collections.Generic;
  3  using System.Linq;
  4  using System.Text;
  5  // 新添命名空间
  6  using System.Data;
  7  using System.Configuration;
  8  using System.Data.SqlClient;
  9 
 10  namespace HomeShop.DbUtility
 11 {
 12      // 功能:SQL Server数据访问基础类;
 13       // 作者:夏春涛;
 14       // 日期:2011-11-30;
 15       public  class SqlDbHelper
 16     {
 17          // 数据库连接字符串
 18           private  string connectionString =  "";
 19          public  string ConnectionString
 20         {
 21              get { return connectionString; }
 22         }
 23 
 24          // 数据库连接对象
 25           private SqlConnection connection;
 26         
 27          // 默认构造函数,从应用程序配置文件中读取第1个数据库连接字符串
 28           public SqlDbHelper()
 29         {
 30              this.connectionString = ConfigurationManager.ConnectionStrings[ 1].ConnectionString;
 31              this.connection =  new SqlConnection( this.connectionString);            
 32         }
 33 
 34          // 重载构造函数,根据入参初始化数据库连接字符串
 35           public SqlDbHelper( string connectionString)
 36         {
 37              this.connectionString = connectionString;
 38              this.connection =  new SqlConnection( this.connectionString);
 39         }
 40 
 41          // 执行SQL命令(Select),获取返回数据
 42           public DataTable ExecuteQuery( string selectCommandText,  params SqlParameter[] cmdParameters)
 43         {
 44             SqlCommand command =  new SqlCommand();
 45             PrepareCommand(command,  null, CommandType.Text, selectCommandText, cmdParameters);
 46             SqlDataAdapter adapter =  new SqlDataAdapter(command);
 47             DataTable dataTable =  new DataTable();
 48             adapter.Fill(dataTable);
 49             connection.Close();
 50 
 51              return dataTable;
 52         }        
 53 
 54          // 执行多条SQL(Insert/Delete/Update),以数据库事务方式
 55           public  int ExecuteNonQueryTrans(List<SqlCmdTextAndParams> listCmdTextAndParams)
 56         {
 57              int rowsCountAffected =  0;
 58              // 开始数据库事务
 59              SqlTransaction trans = BeginTransaction();
 60             SqlCommand command =  new SqlCommand();
 61              try
 62             {
 63                  // 循环执行每一个CommandTextAndParameters对象
 64                   foreach (SqlCmdTextAndParams cmdTextAndParams  in listCmdTextAndParams)
 65                 {
 66                     PrepareCommand(command, trans, CommandType.Text, cmdTextAndParams.CommandText, cmdTextAndParams.CommandParameters);
 67                     rowsCountAffected += command.ExecuteNonQuery();
 68                      // 清空参数列表,避免参数重名问题
 69                      command.Parameters.Clear();
 70                 }
 71                 trans.Commit(); // 提交数据库事务
 72              }
 73              catch
 74             {
 75                 trans.Rollback(); // 回滚数据库事务
 76                   throw;
 77             }
 78             connection.Close();
 79 
 80              return rowsCountAffected;
 81         }
 82 
 83          // 开始(生成)一个数据库事务
 84           public SqlTransaction BeginTransaction()
 85         {
 86              if (connection.State != ConnectionState.Open)
 87                 connection.Open();
 88             SqlTransaction trans = connection.BeginTransaction();
 89 
 90              return trans;
 91         }
 92 
 93          // 执行SQL命令(Insert/Delete/Update)
 94           public  int ExecuteNonQuery( string cmdText,  params SqlParameter[] cmdParameters)
 95         {
 96              int rowsCountAffected = ExecuteNonQuery( null, cmdText, cmdParameters);
 97             connection.Close();
 98              return rowsCountAffected;
 99         }
100 
101          // 在指定的数据库事务中执行SQL命令,最后要手工提交事务
102           public  int ExecuteNonQuery(SqlTransaction inTransaction,  string cmdText,  params SqlParameter[] cmdParameters)
103         {
104              int rowsCountAffected =  0;
105             SqlCommand command =  new SqlCommand();
106             PrepareCommand(command, inTransaction, CommandType.Text, cmdText, cmdParameters);
107             rowsCountAffected += command.ExecuteNonQuery();
108             command.Parameters.Clear(); // 清空参数列表,避免参数重名问题
109               // connection.Close(); // 在数据库事务结束时才能关闭连接
110 
111              return rowsCountAffected;
112         }
113 
114          // 获取查询结果集中的第一行的第一列内容
115           public Object ExecuteScalar( string selectCommandText,  params SqlParameter[] cmdParameters)
116         {
117             Object obj = ExecuteScalar( null, selectCommandText, cmdParameters);
118             connection.Close();
119              return obj;
120         }
121 
122          // 获取查询结果集中的第一行的第一列内容
123           public Object ExecuteScalar(SqlTransaction inTransaction,  string selectCommandText,  params SqlParameter[] cmdParameters)
124         {
125             SqlCommand command =  new SqlCommand();
126             PrepareCommand(command, inTransaction, CommandType.Text, selectCommandText, cmdParameters);
127             Object obj = command.ExecuteScalar();
128             command.Parameters.Clear(); // 清空参数列表,避免参数重名问题
129               // connection.Close(); // 在数据库事务结束时才能关闭连接
130 
131              return obj;
132         }
133 
134          // 关闭数据库连接
135           public  void Close()
136         {
137              if (connection.State != ConnectionState.Closed )
138                 connection.Close();
139         }
140 
141          /* ************************************************************************************** */
142 
143          // 预处理Command对象
144           private  void PrepareCommand(SqlCommand command, SqlTransaction inTransation,
145             CommandType cmdType,  string cmdText, SqlParameter[] cmdParameters)
146         {
147              if (connection.State != ConnectionState.Open)
148                 connection.Open();
149 
150             command.Connection = connection;
151             command.CommandType = cmdType;
152             command.CommandText = cmdText;
153 
154              if (inTransation !=  null)
155                 command.Transaction = inTransation;
156 
157              if (cmdParameters !=  null)
158             {
159                  foreach (SqlParameter param  in cmdParameters)
160                     command.Parameters.Add(param);
161             }
162         }
163     } 
164 }

 

 SqlCmdTextAndParams.cs

 

img_405b18b4b6584ae338e0f6ecaf736533.gif View Code
 1  using System;
 2  using System.Collections.Generic;
 3  using System.Linq;
 4  using System.Text;
 5  using System.Data.SqlClient; // 新添命名空间
 6 
 7  namespace HomeShop.DbUtility
 8 {
 9      // 用于保存一条SQL命令及对应参数的类
10       public  class SqlCmdTextAndParams
11     {
12          public SqlCmdTextAndParams( string commandText,  params SqlParameter[] commandParamters)
13         {
14              this.CommandText = commandText;
15              this.CommandParameters = commandParamters;
16         }
17 
18          public  string CommandText {  setget; }
19 
20          public SqlParameter[] CommandParameters {  setget; }
21     }
22 }

 

 //===============================================================

//支持Access访问的OleDbHelper.cs

 OleDbHelper.cs

  1  using System;
  2  using System.Collections.Generic;
  3  using System.Linq;
  4  using System.Text;
  5  // 新添命名空间
  6  using System.Data;
  7  using System.Configuration;
  8  using System.Data.OleDb;
  9 
 10  namespace HomeShop.DbUtility
 11 {
 12      // 功能:OleDb数据访问基础类;
 13       // 作者:夏春涛;
 14       // 日期:2011-12-05;
 15       public  class OleDbHelper
 16     {
 17          // 数据库连接字符串
 18           private  string connectionString =  "";
 19          public  string ConnectionString
 20         {
 21              get {  return connectionString; }
 22         }
 23 
 24          // 数据库连接对象
 25           private OleDbConnection connection;
 26 
 27          // 默认构造函数,从应用程序配置文件中读取第1个数据库连接字符串
 28           public OleDbHelper()
 29         {
 30              this.connectionString = ConfigurationManager.ConnectionStrings[ 1].ConnectionString;
 31              this.connection =  new OleDbConnection( this.connectionString);
 32         }
 33 
 34          // 重载构造函数,根据入参初始化数据库连接字符串
 35           public OleDbHelper( string connectionString)
 36         {
 37              this.connectionString = connectionString;
 38              this.connection =  new OleDbConnection( this.connectionString);
 39         }
 40 
 41          // 执行SQL命令(Select),获取返回数据
 42           public DataTable ExecuteQuery( string selectCommandText,  params OleDbParameter[] cmdParameters)
 43         {
 44             OleDbCommand command =  new OleDbCommand();
 45             PrepareCommand(command,  null, CommandType.Text, selectCommandText, cmdParameters);
 46             OleDbDataAdapter adapter =  new OleDbDataAdapter(command);
 47             DataTable dataTable =  new DataTable();
 48             adapter.Fill(dataTable);
 49             connection.Close();
 50 
 51              return dataTable;
 52         }
 53 
 54          // 执行多条SQL命令(Insert/Delete/Update),以数据库事务方式
 55           public  int ExecuteNonQueryTrans(List<OleDbCmdTextAndParams> listCmdTextAndParams)
 56         {
 57              int rowsCountAffected =  0;            
 58              // 开始数据库事务
 59              OleDbTransaction trans = BeginTransaction();
 60             OleDbCommand command =  new OleDbCommand();            
 61              try
 62             {
 63                  // 循环执行每一个CommandTextAndParameters对象
 64                   foreach (OleDbCmdTextAndParams cmdTextAndParams  in listCmdTextAndParams)
 65                 {
 66                     PrepareCommand(command, trans, CommandType.Text, cmdTextAndParams.CommandText, cmdTextAndParams.CommandParameters);                    
 67                     rowsCountAffected += command.ExecuteNonQuery();
 68                      // 清空参数列表,避免参数重名问题
 69                      command.Parameters.Clear();
 70                 }
 71                 trans.Commit(); // 提交数据库事务
 72              }
 73              catch
 74             {
 75                 trans.Rollback(); // 回滚数据库事务
 76                   throw;
 77             }
 78             connection.Close();
 79 
 80              return rowsCountAffected;
 81         }
 82 
 83          // 开始(生成)一个数据库事务
 84           public OleDbTransaction BeginTransaction()
 85         {
 86              if (connection.State != ConnectionState.Open)
 87                 connection.Open();
 88             OleDbTransaction trans = connection.BeginTransaction();
 89 
 90              return trans;
 91         }
 92 
 93          // 执行SQL命令(Insert/Delete/Update)
 94           public  int ExecuteNonQuery( string cmdText,  params OleDbParameter[] cmdParameters)
 95         {
 96              int rowsCountAffected = ExecuteNonQuery( null, cmdText, cmdParameters);
 97             connection.Close();
 98              return rowsCountAffected;
 99         }
100 
101          // 在指定的数据库事务中执行SQL命令,最后要手工提交事务
102           public  int ExecuteNonQuery(OleDbTransaction inTransaction,  string cmdText,  params OleDbParameter[] cmdParameters)
103         {
104              int rowsCountAffected =  0;
105             OleDbCommand command =  new OleDbCommand();
106             PrepareCommand(command, inTransaction, CommandType.Text, cmdText, cmdParameters);
107             rowsCountAffected += command.ExecuteNonQuery();
108             command.Parameters.Clear(); // 清空参数列表,避免参数重名问题
109               // connection.Close(); // 在数据库事务结束时才能关闭连接
110 
111              return rowsCountAffected;
112         }
113 
114          // 获取查询结果集中的第一行的第一列内容
115           public Object ExecuteScalar( string selectCommandText,  params OleDbParameter[] cmdParameters)
116         {
117             Object obj = ExecuteScalar( null, selectCommandText, cmdParameters);
118             connection.Close();
119              return obj;
120         }
121 
122          // 获取查询结果集中的第一行的第一列内容
123           public Object ExecuteScalar(OleDbTransaction inTransaction,  string selectCommandText,  params OleDbParameter[] cmdParameters)
124         {
125             OleDbCommand command =  new OleDbCommand();
126             PrepareCommand(command, inTransaction, CommandType.Text, selectCommandText, cmdParameters);
127             Object obj = command.ExecuteScalar();
128             command.Parameters.Clear(); // 清空参数列表,避免参数重名问题
129               // connection.Close(); // 在数据库事务结束时才能关闭连接
130 
131              return obj;
132         }
133 
134          // 关闭数据库连接
135           public  void Close()
136         {
137              if (connection.State != ConnectionState.Open)
138                 connection.Close();
139         }
140 
141          /* ************************************************************************************** */
142        
143          // 预处理Command对象
144           private  void PrepareCommand(OleDbCommand command, OleDbTransaction inTransation, 
145             CommandType cmdType,  string cmdText, OleDbParameter[] cmdParameters)
146         {
147              if (connection.State != ConnectionState.Open)
148                 connection.Open();
149 
150             command.Connection = connection;
151             command.CommandType = cmdType;
152             command.CommandText = cmdText;
153 
154              if (inTransation !=  null)
155                 command.Transaction = inTransation;
156 
157              if (cmdParameters !=  null)
158             {
159                  foreach (OleDbParameter param  in cmdParameters)
160                     command.Parameters.Add(param);
161             }
162         }
163     }
164 }

 

 

OleDbCmdTextAndParams.cs

img_405b18b4b6584ae338e0f6ecaf736533.gif View Code
 1  using System;
 2  using System.Collections.Generic;
 3  using System.Linq;
 4  using System.Text;
 5  // 新添命名空间
 6  using System.Data.OleDb;
 7 
 8  namespace HomeShop.DbUtility
 9 {
10      // 用于保存一条SQL命令及对应参数的类
11       public  class OleDbCmdTextAndParams
12     {
13          public OleDbCmdTextAndParams( string commandText,  params OleDbParameter[] commandParamters)
14         {
15              this.CommandText = commandText;
16              this.CommandParameters = commandParamters;
17         }
18 
19          public  string CommandText {  setget; }
20 
21          public OleDbParameter[] CommandParameters {  setget; }
22     }
23 }

 

源码下载:/Files/SummerRain/NetDbDevRoad/7使用ADONET实现工厂模式DB切换.rar

数据下载:/Files/SummerRain/NetDbDevRoad/HomeShopDB.rar

 

 

 

目录
相关文章
|
27天前
|
SQL 数据库连接 数据库
你不知道ADo.Net中操作数据库的步骤【超详细整理】
你不知道ADo.Net中操作数据库的步骤【超详细整理】
15 0
|
1月前
|
SQL 数据库 C#
C# .NET面试系列十一:数据库SQL查询(附建表语句)
#### 第1题 用一条 SQL 语句 查询出每门课都大于80 分的学生姓名 建表语句: ```sql create table tableA ( name varchar(10), kecheng varchar(10), fenshu int(11) ) DEFAULT CHARSET = 'utf8'; ``` 插入数据 ```sql insert into tableA values ('张三', '语文', 81); insert into tableA values ('张三', '数学', 75); insert into tableA values ('李四',
61 2
C# .NET面试系列十一:数据库SQL查询(附建表语句)
|
1月前
|
数据库
ABAP 泛型编程实战 - 分享一个数据库表内容的拷贝工具试读版
ABAP 泛型编程实战 - 分享一个数据库表内容的拷贝工具试读版
17 0
|
2月前
|
开发框架 Oracle 关系型数据库
ASP.NET实验室LIS系统源码 Oracle数据库
LIS是HIS的一个组成部分,通过与HIS的无缝连接可以共享HIS中的信息资源,使检验科能与门诊部、住院部、财务科和临床科室等全院各部门之间协同工作。 
35 4
|
15天前
|
存储 NoSQL Java
Java数据库编程指南:实现高效数据存储与访问
【4月更文挑战第2天】Java开发者必须掌握数据库编程,尤其是JDBC,它是连接数据库的标准接口。使用Spring JDBC或JPA能简化操作。选择合适的JDBC驱动,如MySQL Connector/J,对性能至关重要。最佳实践包括事务管理、防SQL注入、优化索引和数据库设计。NoSQL数据库如MongoDB也日益重要,Java有对应的驱动支持。理解这些概念和技术是构建高效数据库应用的基础。
Java数据库编程指南:实现高效数据存储与访问
|
3月前
|
存储 关系型数据库 MySQL
由浅入深:数据库编程概念与实战
由浅入深:数据库编程概念与实战
151 1
|
3月前
|
存储 NoSQL API
一个小巧、快速、轻量级的 .NET NoSQL 嵌入式数据库
一个小巧、快速、轻量级的 .NET NoSQL 嵌入式数据库
135 0
|
27天前
|
SQL 安全 数据库连接
使用ADO.NET访问数据库
使用ADO.NET访问数据库
10 0
|
29天前
|
SQL 存储 关系型数据库
【C/C++ 应用开发 数据库】入门 Qt数据库编程:从基本操作到高级技巧
【C/C++ 应用开发 数据库】入门 Qt数据库编程:从基本操作到高级技巧
70 0
|
1月前
|
SQL 存储 关系型数据库
C# .NET面试系列十:数据库概念知识
#### 1. 为什么要一定要设置主键? 设置主键是数据库设计中的一个重要概念,有几个主要原因: 1、唯一性 ```c# 主键必须保证表中的每一行都有唯一的标识。这样可以避免数据冗余和不一致性。如果没有主键或者主键不唯一,就可能出现数据混乱或错误。 ``` 2、查询性能 ```c# 数据库系统通常会使用主键来加速数据检索。主键通常会被索引,这样可以更快速地找到特定行的数据,提高查询效率。 ``` 3、关联性 ```c# 主键常常用于建立表与表之间的关系。在关系数据库中,一个表的主键通常与其他表中的外键建立关联,这种关系对于数据的一致性和完整性非常重要。 ``` 4、数据完
130 1
C# .NET面试系列十:数据库概念知识