最關鍵的在於獲取捕獲表資訊(系統表中間_ct結尾的資料)。
根據網上資料查取,找到了獲取當前捕獲表時間區間範圍內資料的方式。
見[sql server 多表資料增量獲取和發布 2.3(
--10.按照時間範圍查詢cdc結果
declare @from_lsn binary(10),@end_lsn binary(10)
declare @start_time datetime = '2018-08-01'
declare @end_time datetime ='2018-08-30'
select @from_lsn=sys.fn_cdc_map_time_to_lsn('smallest greater than or equal',@start_time)
select @end_lsn=sys.fn_cdc_map_time_to_lsn(' largest less than or equal',@end_time)
select * from cdc.fn_cdc_get_all_changes_dbo_department(@from_lsn,@end_lsn,'all')
資料既然能夠通過sql語句獲取到,那麼邏輯判斷就會變得簡單,通過分析我們可以發現select * from *** ,***就是上文中講到的cdc生成的錶值函式,錶值函式前面相等,可變化的就是架構名_表名稱(dbo_person)
所以我們完全可以通過拼接sql語句得到我們需要的內容,可以預設返回給我們的資料是不友好的,我們還需要自己在做一步設定,將某些字段變成我們好理解的內容
如對下文內容不理解,可翻閱lz之前的文章
通過檢視cdc生成的捕獲表我們發現,其實他是在原來的資料表結構上新增了幾個欄位給我們,其他的表也相同。
那我們在**中對實體的設計就可以基於繼承相同父類的方式,定義乙個父類,擁有共同屬性
public partial class extbase
/// /// 操作方式 1 = 刪除,2 = 插入,3 = 更新(舊值),4 = 更新(新值)
///
public int operation
}
其他表都是在自己原來欄位的基礎上繼承當前父類
public class department : extbase
public string name
}public class person : extbase
public string name
public int? age
}
實體類結構完畢後我們開始考慮獲取資料的業務邏輯,根據業務我們可以假設獲取資料的方法幾乎相同,不同的地方就是返回的資料實體集合不同,那我們通過何種方法來完成邏輯的有效封裝,這是需要考慮的問題。
經過思考,我構想出了一種方法
1、定義乙個抽象基類,在其中定義公共業務邏輯(getdate)方法,然後定義乙個抽象方法,抽象方法需要被子類繼承,而子類需要做的就是覆寫父類的getdata方法,唯一需要修改的就是傳遞的實體——可以採用泛型變數的形式去實現
2、等所有的子類構建完成以後,建立乙個簡單工廠,傳遞需要的引數,然後根據引數中的唯一識別符號,例項化對應的操作類去執行公共方法。
首先是基類抽象類
/// /// cdc 資料捕獲服務類
///
///
public abstract class ctbaseservice
_ct] where[__$operation] in(1, 2, 4) and sys.fn_cdc_map_lsn_to_time(__$start_lsn) > ''
and sys.fn_cdc_map_lsn_to_time(__$start_lsn) <= '';";
string nowdate = datetime.now.tostring();
query = string.format(query, startdatetime.tostring(), nowdate, schema_table);
var querylist = conn.query(query).tolist();
return querylist;
}/// /// 抽象方法,由父類實現
///
///
///
///
public abstract void work(int id, string schema_table, datetime startdatetime);
/// /// 得到cdc捕獲資料並插入佇列
///
///
///
///
///
protected void getrangelistandinsertqueue(int id, string schema_table, datetime startdatetime) where t : extbase, new()}}
}
子類實現我們可以發現子類實現非常好理解,正如上文所說,基類提供了乙個抽象介面供子類實現,而子類也真的只需要修改乙個實體就可以。如果大家不懂,可以多看幾遍來裂解其中的設計方式。
public class departmentct : ctbaseservice
}
public class personct : ctbaseservice
}
最後我們建立乙個工廠類,工廠類主要負責接受引數並建立對應的ct幫助類,**結構如下。根據表名作為唯一識別符號字段,建立***ct服務類,然後因為他們繼承並覆寫了父類抽象方法work,所以呼叫.work方法即可實現獲取資料並插入佇列的功能。
public class ctcexecutefactory
if (service != null) service.work(id, string.format("_", schemaname, tablename), updatetime);}}
SQL Server 多表資料增量獲取和發布 1
子公司統一門戶系統已完成開發,安全執行一年。接到通知,總部也開發了一套統一門戶,要求各子公司使用總部開發的平台,子公司領導討論決定使用總公司開發的平台,但是也不放棄自己開發的平台,而使用乙個折中的方案 使用子公司統一平台發布資訊後需要將資料同步到總公司開發的平台資料庫中 時間間隔需要越短越好 1 無...
Sql Server多表查詢
同庫操作 select a.列名1,b.列名2,a.列名3 from 表名1 as a join 表名2 as b on a.關聯字段 b.關聯字段 不同庫操作 select a.列名1,b.列名2,a.列名3 from 庫名1.dbo.表名1 as a join 庫名2.dbo.表名2 as b ...
SQLServer多表聯查,多表分頁查詢
多表聯查 select p.s.sheng i.shi from dbo productrecordinfo 表名 p left join shenginfo s on p.shenginfo s.shengid 使用left join左連線 讓兩個表中的指定字段產生連線關係 left join s...