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民工,轉載請注明原文鏈接:http://www.rzrgm.cn/kook2007/p/17151863.html

浙公網安備 33010602011771號