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的驱动中拷贝到项目中

posted @ 2023-02-24 16:02  GIS民工  阅读(236)  评论(0编辑  收藏  举报