前言:
很久之前,就有同学问我CYQ.Data能不能支持下PostgreSQL,之后小做了下调查,发现这个数据库用的人少,加上各种因素,就一直没动手。
前两天,不小心看了一下Github上的消息:
看到这个问题又被重新提了出来了,于是,闹吧!
下面分享一下支持该数据库要处理的过程,让大伙明白CYQ.Data要支持一种新的数据库,需要花多少功夫。
1、找到数据库的驱动程序:Npgsql.dll
网上查找了点相关知识,发现.NET 里操作PostgreSQL有两种提供的dll,一种是正规的收费的,另一种是开源的Npgsql.dll,因此这里选择了开源的。
在Nuget上可以搜索Npgsql,不过上面的版本要求依赖的版本很高,于是我找了最早的版本开始支持,毕竟CYQ.Data 是从支持最低2.0及以上的。
2、创建PostgreDal.cs,实现动态加载DLL
添加动态加载的代码:
usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Reflection;usingSystem.Data.Common;usingCYQ.Data.Cache;usingSystem.IO;namespaceCYQ.Data
{internal classPostgreDal : DbBase
{publicPostgreDal(ConnObject co)
:base(co)
{
}internal staticAssembly GetAssembly()
{object ass = CacheManage.LocalInstance.Get("Postgre_Assembly");if (ass == null)
{try{string name = string.Empty;if (File.Exists(AppConst.RunFolderPath + "Npgsql.dll"))
{
name= "Npgsql";
}else{
name= "Can't find the Npgsql.dll";
Error.Throw(name);
}
ass=Assembly.Load(name);
CacheManage.LocalInstance.Set("Postgre_Assembly", ass, 10080);
}catch(Exception err)
{string errMsg =err.Message;
Error.Throw(errMsg);
}
}return ass asAssembly;
}protected override DbProviderFactory GetFactory(stringproviderName)
{object factory = CacheManage.LocalInstance.Get("Postgre_Factory");if (factory == null)
{
Assembly ass=GetAssembly();
factory= ass.GetType("Npgsql.NpgsqlFactory").GetField("Instance").GetValue(null);//factory = ass.CreateInstance("Npgsql.NpgsqlFactory.Instance");
if (factory == null)
{throw new System.Exception("Can't Create NpgsqlFactory in Npgsql.dll");
}else{
CacheManage.LocalInstance.Set("Postgre_Factory", factory, 10080);