SQL Server数据写到KingbaseES的实践
中间库是oracle的,通过sqlserver的链接服务器访问Oracle Provider for OLEDB读写Oracle数据库,后来中间``库改为人大金仓KingbaseES V8.6了,传统关系数据库写到国产化数据库往往只能通过odbc(jdbc)等,但各厂家对odbc或jdbc的支持不一定都非常积极,造成实际使用中经常有很多问题。
从人大金仓官网下载odbc驱动,在sqlserver中建立链接服务器,但是遇到了一个问题:select、delete没问题,insert和update都出现 链接服务器 SQLExtendedFetch unable due to the connection lost 错误
,只好换了思路,通过链接服务器,将kingbase中已有记录的主键记录到本地sqlserver库,sqlserver建立视图得到待插入的记录,以及将需要更改的记录写到sqlserver临时表中,再通过代码处理插入和更新工作。
用到的几个工具:
- 1、freesql。因kingbase提供.net驱动,相对具有更高的写入性能和稳定性,freesql对国产数据库做了很多支持性工作
- 2、AutoMapper。通过AutoMapper快速将获取到的实体转换成要插入的Kingbase实体
- 3、quartz.net。任务调度
因为各个表的插入和更新除了表明不一样,其他方式都一样,充分利用泛型将代码模式化
从sqlserver获取数据,写到kingbase
public void WriteData2Kingbase<T,Tr>(IFreeSql fsqlMssql,IFreeSql fsqlKingbase,IMapper mapper) where T:class where Tr : class
{
List<T> origin = fsqlMssql.Select<T>().ToList();
List<Tr> target = mapper.Map<List<Tr>>(origin);
int cnt = fsqlKingbase.Insert(target).ExecuteAffrows();
Logger.Error($"插入{nameof(Tr)}:{cnt}行");
}
从sqlserver获取要更新的记录,批量更新到kingbase
public void UpdateData2Kingbase<T, Tr>(IFreeSql fsqlMssql, IFreeSql fsqlKingbase, IMapper mapper,int state) where T : class,IOrignEntity where Tr : class, ITargetEntity
{
List<long> codes = fsqlMssql.Select<T>().ToList(a => a.CODE);
if (codes != null && codes.Count > 0)
{
int cnt=fsqlKingbase.Update<Tr>()
.Set(a => a.STATE, state)
.Set(a => a.I_FLAG, 0)
.Set(a => a.I_TYPE, "0")
.Set(a => a.I_TIME, DateTime.Now)
.Where(a => codes.Contains(a.CODE))
.ExecuteAffrows();
Logger.Error($"更新{nameof(Tr)}:{cnt}行");
}
fsqlMssql.Delete<T>().Where("1=1").ExecuteAffrows();
}
AutoMapper和quartz.net网上相关使用说明非常多。需要注意的是从nuget获取freesql.provider.kingbase时,kndp所需的几个dll没有自动过来,需要从人大金仓官网kndp的驱动中拷贝到项目中
本文来自博客园,作者:GIS民工,转载请注明原文链接:https://www.cnblogs.com/kook2007/p/17151863.html