问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何让程序支持多种数据库

发布网友 发布时间:2022-04-30 01:32

我来回答

3个回答

懂视网 时间:2022-04-30 05:53

C#实现多数据库支持的方式,大家都会多少了解,本文从General框架的开发思路角度详细介绍General框架实现多数据库支持的方式,使更多的人了解General框架的底层实现并得到所需的相关知识。我在开发General框架之中,从网络中获取到了很多知识,对其他ORM框架亦有借鉴,其中借鉴最多的是NBear框架和NHibernate框架,我将从各处得到的开发思想融合进来,形成了我自己的开发方式。

简单说来,General框架支持多数据库的实现思路,无非是以下几点:

1、Ado.Net的多数据支持

2、SQL的多数据支持

3、数据管理器的多数据库支持

下面将具体进行说明。

1、Ado.Net的多数据支持

当我们初学C#的时候,会了解Ado.Net有五大对象,即Connection(连接对象)、Command(命令或执行对象)、DataReader(读取器对象)、DataAdapter(适配器对象)、DataSet(数据集对象),而我们开始常用的SqlHelper中,这五大对象是SqlConnection、SqlCommand、SqlDataReader、SqlDataAdapter、DataSet,后来可能会接触到支持多数据库版的SqlHelper,即DbHelper,这里面的五大对象会变为DbConnection、DbCommand、IDataReader、DbDataAdapter、DataSet,再后来我们发现其实SqlConnection、SqlCommand、SqlDataReader、SqlDataAdapter分别是DbConnection、DbCommand、IDataReader、DbDataAdapter的子类,即Ado.Net使用了抽象类来适应多数据库支持,所以编写支持多数据库的应用程序,只需要使用Db开头的Ado.Net对象就可以了。但是抽象类不能直接实例化怎么办,其实这里面还有一个工厂类用来创建抽象类的实例,即DbProviderFactory,但DbProviderFactory也是抽象类,仍然无法实例化,这时我们需要根据具体数据库类型,来使用不同数据库对应的Ado.Net的驱动中的DbProviderFactory的Instance就可以,各数据库对应的驱动类库和工厂类如下:

序号

数据库类型

对应的驱动类库

对应的工厂类

1

Access

System.Data.OleDb(自带)

OleDbFactory.Instance

2

Sqlite

System.Data.Sqlite(需下载)

SQLiteFactory.Instance

3

SqlServer

System.Data.SqlClient(自带)

SqlClientFactory.Instance

4

Oracle

System.Data.OracleClient(自带)

OracleClientFactory.Instance

5

MySql

MySql.Data(需下载)

MySqlClientFactory.Instance

在General.Data中有一个BaseProvider,这个类是一个抽象类,负责提供数据库对应的工厂类的实例,每种数据库类型需实现自己的Provider并继承于BaseProvider,并提供实际的工厂类实例。还有一个DbCommon类,这个类负责跟Ado.Net打交道,使用的都是Db版的五大对象,它的构造函数参数即是BaseProvider,即需要用具体的Provider实现来创建DbCommon,而DbCommon就可以用具体的Provider实现所提供的工厂类实例来创建Db版的五大对象,这样也就可以使DbCommon可以适应不同类型的数据库。

2、SQL的多数据库支持

在Ado.Net层面实现多数据库支持之后,由于Ado.Net实际不涉及SQL的拼装,并且各数据库在SQL的实现上都会有多少的差异,比如SqlServer的参数前缀是“@”,而Oracle的是“:”,SqlServer用中括号括起来表示标记名称,而Oracle用双引号括起来表示标记名称,再如Sqlite没有“Top”关键字而有类似的“Limit”关键字等等,所以要实现支持多数据库的ORM框架,在生成Sql的时候需要根据不同的数据库类型来进行区别。

General.Data中有一个QueryBuilder类,这个类用来生成Sql语句,而这个类是抽象类,即每个数据库类型需要实现自己的QueryBuilder来区别不同的Sql语法,而通用部分的Sql,比如Select、Insert、Update、Delete等语句各数据库是一样的,所以不需要抽象而在抽象类中直接实现。QueryBuilder类不需要自身创建,而是通过BaseProvider的抽象方法GetQueryBuilder来由每个Provider的实现来创建,相应与QueryBuilder类似的SchemaManager也由BaseProvider的抽象方法GetSchemaManager来由每个Provider的实现来创建。这样,上层只要掌握Provider的创建,即可掌握对各数据库类型的支持。

3、数据管理器的多数据库支持

General.Data中DataManager类是所有数据库操作的接口,上一段说过:只要掌握Provider的创建,即可掌握对各数据库类型的支持。所以DataManager的初始化,其实就是Provider、DbCommon、QueryBuilder、SchemaManager的创建过程,而有了Provider,其余三者都可以由Provider来创建,而且只需要增加Provider和其对应的QueryBuilder、SchemaManager,就可以增加对更多数据库类型的支持。

为了方便配置,General.Data中添加了DatabaseType枚举类型,将已经实现的数据库类型支持包含在其中。配置时,只需要指定DatabaseType和ConnectionString,DataManager就可以自动创建对应的Provider等类的实例,也就完成了初始化。

在做多数据库支持时,还有一些意外的问题:

1、Sqlite数据库在读取数据时报“该字符串未被识别为有效的 DateTime ”异常

这是由于Sqlite不支持当前系统的日期时间格式,需要在保存数据时,将DateTime类型的值.ToString(“s”),为了解决这个问题,在General框架中加入了实体属性格式化方法,在实体属性映射上加上 Format = “s”,然后将 DataManager.Default.UsePropertyValueFormat = true,即可进行自动格式化。

2、Access数据库在保存数据库时报“xxx字段不能为空”

这是由于Access数据库表的文本字段未开启“允许空字符”,不愿开启这个选项的话可以设置DataManager. AccessConvertEmptyStringToNull = true,这样会自动将空字符转为DBNull值。

3、Oracle数据库在执行操作时报“xxx表或视图不存在”

这是由于建表Sql对表名加了双引号而Sql语句中表名大小写不正确,或建表Sql没有双引号Oracle自动将表名大写而Sql语句中表名不是大写,推荐建表Sql不要对表名加双引号并设置DataManager.OracleConvertQuoteNameToUpper = true。

General框架如何实现多数据库支持

标签:

热心网友 时间:2022-04-30 03:01

看petshop的例子啊 那个有个非常完整的解决方案,就是使用类工厂

我不会话uml图 就随便画个结构图来说明吧

热心网友 时间:2022-04-30 04:19

初学者不要过多接触接口,那样会让你失去学习编程的兴趣的。因为那太抽象了,本来可以new一个类就可以搞定,非要弄那么麻烦的事情。

要支持多个数据库,就是要用到接口,将具体的实现抽象成为接口,让调用者不知道具体的实现细节,而只是知道谁能实现什么。

这就好比房屋出租者、中介和求房者的关系一样。

去下一个Petshop看就可以理解了,Petshop很经典,是入门学习三层架构的最好学习资料。不要看它那么多类库很吓人,如果你仔细查看就能看出,没有那么复杂。
请问各位大神,java如何实现同时支持多种数据库啊?

你可以考虑自己写一个适配器层接口和实现,实现里面写连接多种数据库的逻辑,在里面调用原生JDBC代码或Hibernate, MyBatis那些框架都可以,这样上面那些层都不用改变了。就像下面这个(示例,只写了查,用Hibernate,其他类似):public interface MultiTypeDBSupport { public List getData();// ...} pu...

...程序,怎么实现在一个事务中访问了多种类型数据库。

1、注册数据库驱动 2、用driverMagager获得数据库连接 3、获得connection之后就可以对数据库进行操作了 对于需求,其实也是比较容易实现的。只要对于多个要commit的地方,加到同一个try块中,就可以了。只要一个数据库存储出错,就会跳出该try,之后再 catch中执行对所以数据库的rollback。类似:try{ 以上...

如何在django中使用多个数据库

使用多数据库最简单的方法是设置一个数据库路由方案。缺省的路由方案确保对象 “紧贴”其原本的数据库(例如:一个对象从哪个数据库取得,就保存回哪个数据库)。 缺省的路由方案还确保如果一个数据库没有指定,所有的查询都会作用于 缺省 数据 库。你不必为启动缺省路由方案作任何事,因为它是“开箱即...

...程序,怎么实现在一个事务中访问了多种类型数据库。

可以用手动编程实现

如何在Visual Studio中让应用程序访问数据库

1、首先,打开vs2010并依次单击工具栏的“文件”-->“新建”,新建相应的应用程序,如下图所示。2、其次,完成上述步骤后,与数据库建立连接,通过“视图”菜单找到“服务器资源管理器”选项,然后单击打开,如下图所示。3、接着,完成上述步骤后,在服务器资源管理器中右键单击“数据连接”,然后选择...

app开发用什么数据库?

在进行App开发时,可以使用多种数据库来存储和管理应用程序的数据。以下是几种常用的数据库选择:1.SQLite:SQLite是一种轻量级的嵌入式关系型数据库,适用于小型和中型的移动应用程序。它的特点是文件大小小、部署简单,可以直接嵌入到应用程序中,无需独立的数据库服务器。SQLite适用于离线应用和需要本地...

什么是数据库,数据库管理系统的功能是什么

用户通过dbms访问数据库中的数据,数据库管理员也通过dbms进行数据库的维护工作。它提供多种功能,可使多个应用程序和用户用不同的方法在同时或不同时刻去建立,修改和询问数据库。它使用户能方便地定义和操纵数据,维护数据的安全性和完整性,以及进行多用户下的并发控制和恢复数据库。 按功能划分,数据库管理系统大致可...

一个SQL数据库可以让很多程序同时用到吗?

当然可以,只要你有驱动,怎么连都行。记得采纳啊

django为什么流行(2023年最新整理)

Django可以运行在Apache上,也可以运行在支持WSGI,FastCGI的服务器上。支持多种数据库,已经支持Postgresql,MySql,Sqlite3。 目前,GoogleAppEngine也支持Django的某些部分。 [编辑本段]文档 Django1.0建立了强大完整的文档文档体系(),涵盖了Django的方方面面,并且适合各种水平的读者和开发者.其中还包含若干个简单的示例,你...

我想用C#和sqlserver做一个多表的数据库程序,比如学生信息管理,怎么...

最初,我们从系统面向的用户着手,了解不同用户的各种需求,从而分析得出系统应具备的功能,并依次设计系统的模块结构和功能联系。在分析用户需求时,我们同时分析了系统管理的对象——即系统要管理的数据,把这些数据按照功能分类形成表,完成了数据库的设计。后台程序中数据库的接口也是按数据表的结构来实现...

如何让数据库崩溃 怎样让录入的数据自动录入数据库 如何让数据库中的列自动添加时间 数据库记录的数据不让用户修改 数据库程序 Access数据库程序设计 数据库应用程序有哪些 数据库应用程序 数据库程序设计是什么
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
怎么阻止IE7的"自定义你的设置"??? 手机优酷VIP怎么在TV上用? 沈阳浑南烧烤店中有哪些主要菜系? 沈阳浑南烧烤的地点在哪里? 浑南烧烤饭店都有哪些推荐? 沈阳浑南区的烧烤都有哪些优势亮点? 请问这是鲫鱼鲤鱼还是草鱼?如何区分? 大灾变狼人我到底选哪个职业好呢? 请教台服大灾变前夕德鲁伊天赋加点 玩过台服的兄弟们,说说4.2鸟德和野德PVP怎么样!!! 同样是骁龙855,为什么一加比红米贵2千? 400元的手机,高通骁龙处理器怎么样?想买中兴Q802T.那么便宜的手机用高通,是不是比MTK还垃 正品P30骁龙865全网通5g手机游戏智能安卓学生价适用oppo华为为什么这么便宜? 小米红米手机,为什么是高通骁龙配置并且价格那么便宜 凉拌木耳洋葱怎么做最好吃窍门 洋葱凉拌木耳的食用须知 凉拌洋葱时,洋葱是否需要用开水焯一下? 冬天在室内养殖天堂鸟,叶片卷起,很担心,求大神指导如何让其坚挺起来 我家的天堂鸟慢慢地叶子卷起来,没有长新芽,枯萎了。怎么救过来? 孕妇操的动作轻柔、运动量不算大,有危险吗? 孕妇操是准妈妈的必修课程,做孕妇操有哪些好处? 孕期应不应该做运动?孕妈如何合理安排运动计划? 办qq网吧收费么 胎教运动的种类及实施方法有哪些? 如何建立QQ网吧 孕后期多爬楼梯能有利顺产,这是因为什么呢? QQ网吧在那个网址领QB啊,领2QB的那个 爱情公寓3美嘉让谁操怀孕了 QQ网吧的等级怎么样划分? QQ网吧登陆是什么意思 annakiki在国内哪里有专柜 怎么样下载语音识别 梁静茹新专辑~ 奥特曼贝利亚早期怎么画迪迦 特迪迦奥特曼新年卡怎么画 迪迦奥特曼怎么捏? 如何画一个简单的迪加奥特曼的头 正常有流量信号的情况下,数据流量会突然断网是怎么回事??? 在并购方面,证监会都出台了哪些规定 证监会并购重组委有条件通过到证监会核准需要多少天 中国证券监督管理委员会上市公司并购重组审核委员会工作规程的附件 中国烟草税税率 IPO,再融资,并购重组,证监会都是怎么回应的 证监会规定借壳上市,并购重组市盈率不得超过多少倍 100元一包香烟税收多少 烟草一年为国家创造多少税收 上市公司重组审核期间是否可以启动新的并购 证监会受理资产收购申请批大约要多少时间 如何在ssh框架的项目中使用多数据源,即连接两个或两个以上的数据库 做精油按摩对身体好吗