通过“访问多种数据库”的代码来学习多态!(.net2.0版)

本帖子针对初学者,如果您是老鸟可以略过。

语言环境: asp.net2.0 。数据库没什么了,反正是要到达访问多种数据库的目的,但是语言一定是.net2.0。因为有几个地方.net1.1是不支持的。

目的:使用ADO.net访问多种数据库。

对于一个网站来说,访问数据库可以说是一个很基本的功能了,那么怎么实现这个功能呢?

假设我们要从数据库里读取News表里面的记录,那么常见的代码也许是这样的。

 

sql的访问方法
 1public class DALSQL
 2    {
 3        public DataTable GetNewsList()
 4        {
 5            SqlConnection cn = new SqlConnection(DALFactory.cnString);//DALFactory.cnString 是什么?就是获取连接字符串,下面有说明
 6            SqlDataAdapter da = new SqlDataAdapter("select * from News", cn);
 7            DataTable dt = new DataTable();
 8
 9            da.Fill(dt);//这里我不喜欢加名字,我觉得没有必要。
10
11            return dt;
12        }
13    }

 

这样写没有什么错误,但是如果想要更换数据库怎么办呢?比如现在是SQL 2000,但是由于某种原因要换成Access,那么要怎么写代码呢?

 

OleDb的访问方法
 1public class DALOleDb
 2    {
 3        public DataTable GetNewsList()
 4        {
 5            OleDbConnection cn = new OleDbConnection(DALFactory.cnString);
 6            OleDbDataAdapter da = new OleDbDataAdapter("select * from News", cn);
 7            DataTable dt = new DataTable();
 8
 9            da.Fill(dt);//这里我不喜欢加名字,我觉得没有必要。
10
11            return dt;
12        }
13    }

其实要改的地方并不多,只是把“Sql”换成“OleDb”就可以了。但是表多了就麻烦了,每一个地方都要改一遍,既繁琐又容易出错,怎么办?这时候就可以使用“多态”来解决更换数据库的问题。

先要补充两个基础知识,一个就是继承和多态。继承都不能理解的话,多态就不要想了。我见过的最简单易懂的是博客圆里的小菜编程成长记系列,那里讲得很明白了,我就不多说了(没有他说的那么好)。

http://www.cnblogs.com/cj723/archive/2007/04/02/697431.html  小菜编程成长记系列 (我就是通过这个系列才学会的。这里做一个简单的应用)

另一个基础知识就是,ADO.net的内部结构。当然不是要全部了解,只需要先了解一点点。我们可以借助Reflector.exe来查看内部代码。(Reflector的使用方法请到搜索引擎里找一下

在.net2.0(.net1.1不是这样的,请注意)里面我们可以发现 SqlConnection、OleDbConnection等都是继承自DbConnection。他是一个抽象基类(如果不清楚的话可以先当作父类来看),就是说DbConnection 派生出了 SqlConnection 、OleDbConnection等,这些合起来就“构成”了多态。(用“构成”可能不太准确)。

掌握了以上两点后,我们的代码就好写了。

先写一个函数,返回实例

 

用工厂返回实例
 1public class DALFactory
 2    {
 3        public static string cnString = System.Web.Configuration.WebConfigurationManager.AppSettings["ConnString"];
 4      
 5        public static DbConnection CreateConnection()
 6        {
 7            string DataType = "1";
 8            DbConnection cn = null;
 9
10            switch (DataType)
11            {
12                case "1":
13                    cn = new SqlConnection(cnString);
14                    break;
15                case "3":
16                    cn = new OleDbConnection(cnString);
17                    break;
18            }
19
20            return cn;
21        }
22
23        public static DbDataAdapter CreateDataAdapter(string sql,DbConnection cn)
24        {
25            string DataType = "1";
26            DbDataAdapter da = null;
27
28            switch (DataType)
29            {
30                case "1":
31                    da = new SqlDataAdapter(sql, (SqlConnection)cn);
32                    break;
33                case "3":
34                    da = new OleDbDataAdapter(sql, (OleDbConnection)cn);
35                    break;
36            }
37
38            return da;
39        }
40    }

 

这个函数是不是传说中的简单工厂模式呢?
(if (true){看,我们并不知道什么模式,但是我们从实际需求中很自然的就应用了一个模式}else{算我学艺不精}

把开始的两个函数合并。

 

访问多种数据库的一个方法
 1public class DAL
 2    {
 3        public static DataTable GetNewsList()
 4        {
 5            DbConnection cn = DALFactory.CreateConnection();
 6            DbDataAdapter da = DALFactory.CreateDataAdapter("select * from News ",cn);
 7            DataTable dt = new DataTable();
 8
 9            da.Fill(dt);
10
11            return dt;
12        }
13    }

 

这样呢换数据库了,我们只要改一下,等等,用改函数吗?不需要的,我们只需要把数据库类型放到web.config里面,在 里面读取就可以了,换数据库也不用改代码了。(理想情况下是这样的,但是实际中往往是很复杂的,这里就先不讨论了)。

当然 还是可以再提炼一下的。这里只是为了演示多态,写的不够严谨,实际应用中还要好好考虑设计一下。

让我们来回顾一下使用多态的情况:

从程序的角度来讲:

1、首先要写一个基类,然后写若干子类继承这个基类。
      DbConntion是.net2.0里面自带的,不用我们去写了。SqlConntion就是一个子类,用于SQL数据库的连接。
      只是.ne1.1里面并没有这么设计,所以我才说我的这个方法目前只适合.net2.0。

2、写一个简单工厂根据条件来返回需要的子类。

3、定义一个基类,然后调用工厂获取实例。

从需求的角度来讲:

多种情况都有相同的叫法(比如打开数据库),但是每一种情况的实现方式又都不一样。

ps:
1、为了能够突出重点(多态),所以访问数据库的地方没有使用try,也没有使用using()。一是想简化代码;一是避免争论,使用try还是using本身就有争论,而这里不想讨论这个。所以就没有加。

2、连接字符串的处理也比较“睡意”,并不是很严密。这个有空的话会详细说明的。

3、CreateDataAdapter 函数的处理方法也不是太好,并不是太理想。这里侧重的是多态的应用,并不是具体代码的实现。有空我会写一下我的访问数据库的方法。

4、DataType 应该从Web.config里面读取信息,这里省略了。

5、以上代码已经在vs2005 + sql2005的环境下测试成功。

6、.net2.0里面的代码

DbConnection
1public abstract class DbConnection : Component, IDbConnection, IDisposable
2{
3  省略
4public abstract void Open();
5 //定义了一个虚函数,没有实现功能
6
7
8}

 

SqlConnection
 1[DefaultEvent("InfoMessage")]
 2public sealed class SqlConnection : DbConnection, ICloneable
 3{
 4省略
 5//在子类里面实现 Open的功能
 6public override void Open()
 7{
 8    IntPtr hScp;
 9    Bid.ScopeEnter(out hScp, "<sc.SqlConnection.Open|API> %d#", this.ObjectID);
10    try
11    {
12        if (this.StatisticsEnabled)
13        {
14         }
15    }
16
17
18代码太多了,省略。
19
20}
21

OleDbConnection
 1[DefaultEvent("InfoMessage")]
 2public sealed class OleDbConnection : DbConnection, ICloneable, IDbConnection, IDisposable
 3{
 4
 5省略
 6
 7
 8//实现OleDb的Open。可以看到和SQL的Open是不一样的
 9public override void Open()
10{
11    this.InnerConnection.OpenConnection(this, this.ConnectionFactory);
12    if (((2 & ((OleDbConnectionString) this.ConnectionOptions).OleDbServices) != 0) && ADP.NeedManualEnlistment())
13    {
14        this.GetOpenConnection().EnlistTransactionInternal(Transaction.get_Current(), true);
15    }
16}
17
18}

具体的代码可以使用 Reflector.exe  查看。

 

时间: 2024-08-04 03:56:49

通过“访问多种数据库”的代码来学习多态!(.net2.0版)的相关文章

&lt;转&gt;vc 用ado访问Oracle数据库的代码示例

#pragma once class CDBOp { public: bool ReConnect(); bool CloseConnect(); bool OpenConnect(CString hostName, CString dBName, CString userName, CString password); bool GetItemData(CString itemID, float &price, CString &descript); //取存储过程数据,这里只是举例说明

Java Spring中同时访问多种不同数据库

开发企业应用时我们常常遇到要同时访问多种不同数据库的问题,有时是必须把数据归档到某种数据仓库中,有时是要把数据变更推送到第三方数据库中.使用Spring框架时,使用单一数据库是非常容易的,但如果要同时访问多个数据库的话事件就变得复杂多了. 本文以在Spring框架下开发一个SpringMVC程序为例,示范了一种同时访问多种数据库的方法,而且尽量地简化配置改动. 搭建数据库 建议你也同时搭好两个数据库来跟进我们的示例.本文中我们用了PostgreSQL和MySQL. 下面的脚本内容是在两个数据库中

在数据库访问项目中使用微软企业库Enterprise Library,实现多种数据库的支持

在我们开发很多项目中,数据访问都是必不可少的,有的需要访问Oracle.SQLServer.Mysql这些常规的数据库,也有可能访问SQLite.Access,或者一些我们可能不常用的PostgreSQL.IBM DB2.或者国产达梦数据库等等,这些数据库的共同特点是关系型数据库,基本上开发的模型都差不多,不过如果我们基于ADO.NET的基础上进行开发的话,那么各种数据库都有自己不同的数据库操作对象,微软企业库Enterprise Library是基于这些不同数据库的操作做的抽象模型,适合多数据

SPL3.0正式发布!支持多种数据库访问哦

访问|数据|数据库 SPL 3.0正式发布,升级说明 经过一段时间的修改,SPL终于升到3.0了,之所要升到3.0,主要是因为增加了两种连接方式:ODP.NET与ODBC ODP.NET极大了增强了SPL对Oracle数据库的访问能力,目前使用ODP.NET连接Oracle是最佳的选择,相关的文章可以在网上找一下,蛮多的. ODBC是.NET Framework1.1新增的功能,可以对其他类型的数据库采用ODBC的连接方式. 因此上面两种连接方式的增强,使SPL可以更强的支持多种数据库. SPL

myeclipse中连接mysql数据库示例代码_Mysql

1. 环境配置 下载地址:http://www.mysql.com/downloads/mysql/ 真麻烦,下载的话还需要注册和登录以及填个表.上面的信息还挺全的,乱填的信息也是可以接受的~~ 下载后按提示安装即可,最后设置登录mysql用的密码.安装完成后,测试连接数据库.在开始-程序中点击MYSQL5.5 Command Line cilent,输入刚才设定的密码后,应该后就能连上mysql服务器了. 在安装后的软件包中,mysql_server\Connector J XXXX中可以找到

用JDBC访问一个数据库

访问|数据|数据库 发布者:flyfox 在这个练习里你将学习使用JDBC访问数据库和插入一个记录到数据库的基础知识. 在这个练习里,你将写RegistrationServlet类的register方法.这个类和你在Servlet1A练习里用的一样.在这个练习里,你将使用数据库的功能.这个练习将展示实现用户需求的步骤. 第一部分:理解regsiter()方法在RegistrationServlet中的工作原理 在这个练习里,你将在com.ibm.waslab.JDBC包上工作.扩展Registr

J2ME程序与Servlet通讯访问Access数据库

access|servlet|程序|访问|数据|数据库   作者:关文柏 时间:2005年5月26日 现在J2ME联网的技术很多,本人也只是刚刚接触这方面,这几天帮别人调试了一些这方面的程序,学到了不少东西,下面就谈谈我学习的过程. 首先这种程序可以简化的分解成三个层面,1,J2ME的客户端(MIDlet程序)2,服务器端的servlet(servlet程序)3,数据库(Access或者是SQL等) 下面我通过一个小例子来实现通过手机客户端发送请求,然后服务器端的servlet响应,servle

ASP技术访问WEB数据库

web|访问|数据|数据库 一. 访问WEB数据库的多种方案 目前在WINDOWS环境下有多种访问WEB数据库的技术,主要有: 1.公共网关接口CGI(Common Gateway Interface) CGI是较早实现的技术.适用于多种服务器平台,如UNIX.WINDOWS等,但CGI的开发成本高.维护困难.功能有限.不具备事务处理功能.占用服务器资源较多. 2. INTERNET数据库连接器IDC(Internet Database Connector) IDC集成在ISAPI(Intern

ASP.NET访问Oracle数据库的方法

asp.net|oracle|访问|数据|数据库 引言 Microsoft .NET Framework Data Provider for Oracle(以下简称为.NET for Oracle)是一个.NET Framework的组件.这个组件为我们使用.NET访问Oracle数据库提供了极大的方便.那些使用.NET和Oracle的开发人员,相信会乐的手舞足蹈,因为他们再也不必使用那个并不十分"专业="的OLEDB来访问Oracle数据库了.这个组件的设计非常类似.NET中内置的M