ADO.NET开发数据库无关性应用程序

开发 后端
今天我们要讲的是ADO.NET开发数据库无关性应用程序,数据库无关性(DB Independ),指应用程序运行不依赖于某一数据库(如SQL Server),能够简单切换至其它数据库。

  数据库无关性(DB Independ),指应用程序运行不依赖于某一数据库(如 SqlServer),能够简单(不再编译)切换至其它数据库(如 Oracle)。数据库无关性是衡量系统的一个指标。

  实现数据库无关的应用程序有很多种方式,可采用 NHibernate、EntityFramework 等。

  本文介绍最基本的一种方式,下面一步步完成一个简单的数据库无关的小程序。

  新建项目

  在Visual Studio中新建 Console Application:

  (VS 2010 可以选择不同的 .net 版本,如上选择的是 2.0,也可以选择其它版本,对本示例影响不大)

  项目创建完成后,如下添加对 System.Configuration 的引用:

再给项目添加一个配置文件:

项目准备完毕,结构如下:

  (不知道为什么,System.configuration 中的 configuration 的***个字母成了小写)

  在配置文件中添加连接字符串

  1.   <?xml version="1.0"encoding="utf-8"?> 
  2.   <configuration> 
  3.   <connectionStrings> 
  4.   <add name="default" 
  5. connectionString="server=localhost; 
  6. user id=sa; password=******; database=northwind" 
  7. providerName="System.Data.SqlClient"/>  
  8. connectionString="server=localhost; 
  9. user id=sa; password=******; database=northwind" 
  10.   providerName="System.Data.SqlClient"/>  
  11. connectionString="server=localhost; 
  12. user id=sa; password=******; database=northwind" 
  13.   providerName="System.Data.SqlClient"/> 
  14.   </connectionStrings> 
  15.   </configuration> 

  注意,上面把连接字符写在 connectionStrings 节中。不可写在 appSettings 中,因为程序中要用到 providerName 这个属性。

  编写数据库无关的代码

  在 Program.cs 中引用如下三个命名空间:

  1.   using System.Data;  
  2.   usingSystem.Data.Common;  
  3.   usingSystem.Configuration; 

  首先要把配置文件中的连接字符串信息读出来:

  1. ConnectionStringSettings settings = ConfigurationManager.ConnectionStrings["default"]; 

  ADO.NET 的数据无关使用了工厂模式,根据配置中的 providerName 可以获取到这个工厂:

 

  1. DbProviderFactory factory = DbProviderFactories.GetFactory(settings.ProviderName); 

  DbProviderFactory 提供了多个方法,帮助我们创建访问数据库如需的对象:

  1.    public abstract class DbProviderFactory  
  2.   {  
  3.   //...  
  4.   publicvirtualDbCommand CreateCommand();  
  5.   publicvirtualDbCommandBuilder CreateCommandBuilder();  
  6.   publicvirtualDbConnection CreateConnection();  
  7.   publicvirtualDbConnectionStringBuilder CreateConnectionStringBuilder();  
  8.   publicvirtualDbDataAdapter CreateDataAdapter();  
  9.   publicvirtualDbDataSourceEnumerator CreateDataSourceEnumerator();  
  10.   publicvirtualDbParameter CreateParameter();  
  11.  } 

  DbConnection、DbCommand、DbDataAdapter、DbParameter 等都是数据库无关的。

  下面这几个小例子演示了这些对象的使用:

  1. 查询员工数量

  1.   using (DbConnection connection = factory.CreateConnection())  
  2.   {  
  3.   connection.ConnectionString = settings.ConnectionString;  
  4.   DbCommand command = connection.CreateCommand();  
  5.   command.CommandType = CommandType.Text;  
  6.   command.CommandText = "select count(*) from employees";  
  7.   connection.Open();  
  8.   varobj = command.ExecuteScalar();  
  9.   if(obj isint) employeesCount = (int)obj;  
  10.   elseemployeesCount = (long)obj;  
  11.   connection.Close();  
  12.   }  
  13.   Console.WriteLine("共有员工 {0} 人", employeesCount); 

  count(*) 不同数据库返回值类型不同(SqlServer 返回 Int32,MySql 返回 Int64),10~12行进行了处理。

  2. 使用 DbDataReader

  1.   using (DbConnection connection = factory.CreateConnection())  
  2.   {  
  3.   connection.ConnectionString = settings.ConnectionString;  
  4.   DbCommand command = connection.CreateCommand();  
  5.   command.CommandType = CommandType.Text;  
  6.   command.CommandText = "select * from employees";  
  7.   connection.Open();  
  8.   DbDataReader reader = command.ExecuteReader();  
  9.   while(reader.Read())  
  10.   Console.WriteLine("{0} {1}", reader["FirstName"], reader["LastName"]);  
  11.   connection.Close();  
  12.   } 

  3. 填充 Dataset

  1.   DataSet dataSet = newDataSet();  
  2.   using(DbConnection connection = factory.CreateConnection())  
  3.   {  
  4.   connection.ConnectionString = settings.ConnectionString;  
  5.   DbCommand command = connection.CreateCommand();  
  6.   command.CommandType = CommandType.Text;  
  7.   command.CommandText = "select * from employees";  
  8.   DbDataAdapter adapter = factory.CreateDataAdapter();  
  9.   adapter.SelectCommand = command;  
  10.   connection.Open();  
  11.   adapter.Fill(dataSet, "Employees");  
  12.   connection.Close();  
  13.   } 

  切换数据库

  简单修改配置文件,即可换用其它数据库,如下使用 MySql:

  1.   <?xml version="1.0"encoding="utf-8"?>  
  2.   <configuration>  
  3.   <connectionStrings>  
  4.   <add name="default" 
  5. connectionString="server=localhost; user id=root; password=******; database=northwind" 
  6. providerName="MySql.Data.MySqlClient"/>  connectionString="server=localhost; user id=root; password=******; database=northwind" 
  7.   providerName="MySql.Data.MySqlClient"/>  connectionString="server=localhost; user id=root; password=******; database=northwind" 
  8.   providerName="MySql.Data.MySqlClient"/>  
  9.   </connectionStrings>  
  10.  </configuration> 

  (要安装 MySql Connector Net 才能运行)

  小结

  ADO.NET 提供了数据库无关的类,简化了数据库无关应用程序的开发。

  但开发数据库无关的应用程序还有很多要注意的地方,如上面提到的 count(*) 返回值类型问题,还有要写数据库无关的 Sql 等等,也非易事。

  ***说一下,数据库无关也是有一定限制的,本文介绍的方式只适用于关系型数据。

原文链接:http://www.cnblogs.com/ldp615/archive/2011/07/20/develop-db-independ-application-with-ado-dot-net.html

【编辑推荐】

  1. 详细述说ADO超时相关问题介绍
  2. 漫谈ADO.NET连接池相关注意问题说明
  3. 如何更好的进行ADO.NET连接池连接
  4. 剖析ADO.NET连接池优缺点
  5. 谈谈ADO.NET数据库连接池创建和分配
责任编辑:彭凡 来源: 博客园
相关推荐

2011-10-09 13:38:14

数据库

2009-10-29 13:16:15

ADO.NET应用程序

2009-12-21 13:38:29

ADO.NET应用程序

2010-01-04 13:56:50

ADO.NET应用程序

2009-12-23 17:30:54

ADO.NET应用程序

2009-03-11 14:45:25

Data ServicASP.NETADO.NET

2009-12-23 10:18:21

ADO.NET 应用程

2009-12-24 14:06:22

ADO.NET 应用程

2009-12-23 16:57:35

理解ADO.NET

2009-12-28 16:50:28

ADO.NET应用程序

2009-12-18 16:56:05

ADO.NET应用程序

2009-12-24 14:12:33

2009-12-22 09:59:06

ADO.NET数据库

2009-12-31 09:18:23

ADO.NET对象模型

2011-03-04 11:08:46

ADO.NET数据库

2009-11-03 14:46:47

ADO.NET数据库

2011-05-20 13:11:22

ADO.NET

2009-12-18 17:29:40

ADO.NET应用程序

2009-12-18 17:06:37

ADO.NET 数据库

2009-12-28 10:09:10

ADO.NET连接
点赞
收藏

51CTO技术栈公众号