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

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

发布网友 发布时间:2023-07-29 08:03

我来回答

1个回答

热心网友 时间:2024-12-12 07:42



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框架如何实现多数据库支持
标签:

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
笔记本电脑的哪些牌子什么牌子的笔记本电脑好 笔记本电脑品牌质量排行榜你知道哪个最耐用全面解析笔记本电脑品牌的质 ... 十大笔记本电脑品牌笔记本电脑推荐品牌 各大汽车电脑品牌厂家官方售后服务电话合辑v3.00 哪种笔记本电脑售后好哪个品牌电脑售后好 各大笔记本电脑品牌售后网点及售后电话汇总解决您笔记本电脑问题的选 ... 如何教育孩子成学霸 学霸的家长是怎样培养孩子的? 聪明的懒孩子怎么变成学霸 学霸孩子怎么培养 Django如何使用多数据库方法介绍 新买的thinkpadE531无线网总是断线 我刚买联想IBM E531(4UC)网线连接可以上,无线就上不了 e531为什么不能连接wifi 2022年河南省理科高考人数 河南22年理科高考人数 河南理科考生人数2022 2022年高考理科人数河南 爱笑的罐头是夫妻吗 广州南洋理工职业学院的口腔医学技术专业好吗? 专科医学影像和口腔医学哪个好? 江苏理工学院如何申请路费 小儿推拿李波:宝宝夜啼别着急,分清病因很关键,小儿推拿来帮您 小儿夜啼推拿手法图解 宝宝夜啼怎么推拿 小儿推拿对夜啼有用吗 孩子夜啼小儿推拿 农业银行金钥匙.安心得利.181天还在卖吗? 自藕降压起动器的工作原理是什么? 红警中怎么偷自己,怎么卖矿车,知道的说一下,谢谢 滨海淮悦驾校驾驶员理论考试之前需要理论培训吗? 滨海淮悦驾校总部具体位置在哪,请好心人告知,谢啦 请问:人类可以解脱生老病死? 人类能不能没有生老病死啊? 人在未来有可能解决生老病死这个难题吗 现代未来的生物科技能否解决人类面临的生老病死的问题? 荒野大镖客2怎样隐藏ui 刺客信条英灵殿怎么隐藏ui? 方舟生存进化无ui怎么关 消化不良喝什么粥好 消化不良喝什么汤好 9.10教师节祝福语20字英文短句 经历太少,遇到不顺心就会颓废,活着好累,太年轻,怎样才能让自己百... 二年级有趣的游戏作文四篇 存在可以用什么字代替 斯维诗水光瓶为什么是中国制造出来的 ios10.3.3怎么录屏 苹果x怎么隐藏某个视频 苹果x怎么隐藏视频 ...近视175度 散光200度 还有弱视 请问在西安儿童医院看还是在西安第... 西安哪家医院眼科最好? 您好!刚刚在网上看到你会做贸易引力模型?可以取一下经吗? 东北电力大学理学院研究生院是几级学院