项目中用到了Quartz,也算是Quartz的一个示例。
源库创建数据同步表SYNC_DATA:
CREATE TABLE SYNC_DATA( ID VARCHAR2(36) NOT NULL,TABLE_NAME 50) 10) INT CONSTRAINT sync_data_PK PRIMARY KEY (ID) ) ; COMMENT ON TABLE SYNC_DATA IS '业务数据同步表' ; COMMENT COLUMN SYNC_DATA.ID 主键COLUMN SYNC_DATA.TABLE_NAME 表名COLUMN SYNC_DATA.COMMAND 命令COLUMN SYNC_DATA.TABLE_KEY 表主键COLUMN SYNC_DATA.DATA_ID 数据IDCOLUMN SYNC_DATA.FAIL_COUNT 失败次数COLUMN SYNC_DATA.CREATE_TIME 创建时间COLUMN SYNC_DATA.UPDATE_TIME 更新时间 ;
CREATE OR REPLACE TRIGGER "T_PT_CAMERA_INFO_I" AFTER INSERT ON "SHINY"."PT_CAMERA_INFO" FOR EACH ROW BEGIN INTO sync_data(ID,TABLE_NAME,COMMAND,TABLE_KEY,DATA_ID,FAIL_COUNT,CREATE_TIME) VALUES(sys_guid(),PT_CAMERA_INFO',1)">INSERTID|| '',0END; "T_PT_CAMERA_INFO_U" AFTER UPDATE IF (NVL(to_char(:new.ID),1)">X') != NVL(to_char(:old.ID),1)">)) OR (NVL(to_char(:new.ASSET_ID),1)">!= NVL(to_char(:old.ASSET_ID),1)">OR (NVL(to_char(:new.CAMERA_NO),1)">!= NVL(to_char(:old.CAMERA_NO),1)">OR (NVL(to_char(:new.POSITION_CODE),1)">!= NVL(to_char(:old.POSITION_CODE),1)">OR (NVL(to_char(:new.POSITION_ID),1)">!= NVL(to_char(:old.POSITION_ID),1)">OR (NVL(to_char(:new.CAMERA_NAME),1)">!= NVL(to_char(:old.CAMERA_NAME),1)">OR (NVL(to_char(:new.ORG_ID),1)">!= NVL(to_char(:old.ORG_ID),1)">OR (NVL(to_char(:new.ADDRESS),1)">!= NVL(to_char(:old.ADDRESS),1)">OR (NVL(to_char(:new.CAMERA_IP),1)">!= NVL(to_char(:old.CAMERA_IP),1)">OR (NVL(to_char(:new.LONGITUDE),1)">!= NVL(to_char(:old.LONGITUDE),1)">OR (NVL(to_char(:new.LATITUDE),1)">!= NVL(to_char(:old.LATITUDE),1)">OR (NVL(to_char(:new.SN),1)">!= NVL(to_char(:old.SN),1)">OR (NVL(to_char(:new.CAMERA_MODEL),1)">!= NVL(to_char(:old.CAMERA_MODEL),1)">OR (NVL(to_char(:new.MANUFACTURER),1)">!= NVL(to_char(:old.MANUFACTURER),1)">OR (NVL(to_char(:new.supplier),1)">!= NVL(to_char(:old.supplier),1)">OR (NVL(to_char(:new.ADD_ID),1)">!= NVL(to_char(:old.ADD_ID),1)">OR (NVL(to_char(:new.ADD_TIME,1)">yyyy-mm-dd hh24:mi:ss'),1)">!= NVL(to_char(:old.ADD_TIME,1)">OR (NVL(to_char(:new.MODIFY_ID),1)">!= NVL(to_char(:old.MODIFY_ID),1)">OR (NVL(to_char(:new.MODIFY_TIME,1)">!= NVL(to_char(:old.MODIFY_TIME,1)">OR (NVL(to_char(:new.USER_NAME),1)">!= NVL(to_char(:old.OR (NVL(to_char(:new.PASS_WORD),1)">!= NVL(to_char(:old.PASS_WORD),1)">OR (NVL(to_char(:new.CASE_INSTALL_TYPE),1)">!= NVL(to_char(:old.CASE_INSTALL_TYPE),1)">OR (NVL(to_char(:new.AREA_CODE),1)">!= NVL(to_char(:old.AREA_CODE),1)">OR (NVL(to_char(:new.MONITOR_TYPE),1)">!= NVL(to_char(:old.MONITOR_TYPE),1)">OR (NVL(to_char(:new.POINT_NAME),1)">!= NVL(to_char(:old.POINT_NAME),1)">OR (NVL(to_char(:new.CAMERA_IP6),1)">!= NVL(to_char(:old.CAMERA_IP6),1)">OR (NVL(to_char(:new.subnet_MASK),1)">!= NVL(to_char(:old.subnet_MASK),1)">OR (NVL(to_char(:new.GATEWAY),1)">!= NVL(to_char(:old.GATEWAY),1)">OR (NVL(to_char(:new.MAC_ADDRESS),1)">!= NVL(to_char(:old.MAC_ADDRESS),1)">OR (NVL(to_char(:new.ONU_SN),1)">!= NVL(to_char(:old.ONU_SN),1)">OR (NVL(to_char(:new.CAMERA_TYPE),1)">!= NVL(to_char(:old.CAMERA_TYPE),1)">OR (NVL(to_char(:new.CAMERA_FUN_TYPE),1)">!= NVL(to_char(:old.CAMERA_FUN_TYPE),1)">OR (NVL(to_char(:new.FILL_LIGTH_ATTR),1)">!= NVL(to_char(:old.FILL_LIGTH_ATTR),1)">OR (NVL(to_char(:new.CAMERA_ENCODE_TYPE),1)">!= NVL(to_char(:old.CAMERA_ENCODE_TYPE),1)">OR (NVL(to_char(:new.POWER_TAKE_TYPE),1)">!= NVL(to_char(:old.POWER_TAKE_TYPE),1)">OR (NVL(to_char(:new.POWER_TAKE_LENGTH),1)">!= NVL(to_char(:old.POWER_TAKE_LENGTH),1)">OR (NVL(to_char(:new.soUND_ALARM),1)">!= NVL(to_char(:old.soUND_ALARM),1)">OR (NVL(to_char(:new.RESOLUTION),1)">!= NVL(to_char(:old.RESOLUTION),1)">OR (NVL(to_char(:new.soFT_VERSION),1)">!= NVL(to_char(:old.soFT_VERSION),1)">OR (NVL(to_char(:new.LENS_ParaM),1)">!= NVL(to_char(:old.LENS_ParaM),1)">OR (NVL(to_char(:new.IS_HAVE_CONSOLE),1)">!= NVL(to_char(:old.IS_HAVE_CONSOLE),1)">OR (NVL(to_char(:new.INSTALL_WAY),1)">!= NVL(to_char(:old.INSTALL_WAY),1)">OR (NVL(to_char(:new.LINEAR_WAY),1)">!= NVL(to_char(:old.LINEAR_WAY),1)">OR (NVL(to_char(:new.RESOURCE_PLACE),1)">!= NVL(to_char(:old.RESOURCE_PLACE),1)">OR (NVL(to_char(:new.IMPORT_WATCH),1)">!= NVL(to_char(:old.IMPORT_WATCH),1)">OR (NVL(to_char(:new.POSITION_TYPE),1)">!= NVL(to_char(:old.POSITION_TYPE),1)">OR (NVL(to_char(:new.COMmunitY),1)">!= NVL(to_char(:old.COMmunitY),1)">OR (NVL(to_char(:new.STREET),1)">!= NVL(to_char(:old.STREET),1)">OR (NVL(to_char(:new.WATCH_SPEC_LOCATION),1)">!= NVL(to_char(:old.WATCH_SPEC_LOCATION),1)">OR (NVL(to_char(:new.ROAD_DIRECTION),1)">!= NVL(to_char(:old.ROAD_DIRECTION),1)">OR (NVL(to_char(:new.FOUL_LINE),1)">!= NVL(to_char(:old.FOUL_LINE),1)">OR (NVL(to_char(:new.FEN_JU),1)">!= NVL(to_char(:old.FEN_JU),1)">OR (NVL(to_char(:new.POLICE_STATION),1)">!= NVL(to_char(:old.POLICE_STATION),1)">OR (NVL(to_char(:new.CAMERA_DIRECTION),1)">!= NVL(to_char(:old.CAMERA_DIRECTION),1)">OR (NVL(to_char(:new.INSTALL_HEIGHT),1)">!= NVL(to_char(:old.INSTALL_HEIGHT),1)">OR (NVL(to_char(:new.CROSS_ARM1),1)">!= NVL(to_char(:old.CROSS_ARM1),1)">OR (NVL(to_char(:new.CROSS_ARM2),1)">!= NVL(to_char(:old.CROSS_ARM2),1)">OR (NVL(to_char(:new.INDOOR_OR_NOT),1)">!= NVL(to_char(:old.INDOOR_OR_NOT),1)">OR (NVL(to_char(:new.SPECIAL_PHOTO_PATH),1)">!= NVL(to_char(:old.SPECIAL_PHOTO_PATH),1)">OR (NVL(to_char(:new.LOCATION_PHOTO_PATH),1)">!= NVL(to_char(:old.LOCATION_PHOTO_PATH),1)">OR (NVL(to_char(:new.REAL_PHOTO_PATH),1)">!= NVL(to_char(:old.REAL_PHOTO_PATH),1)">OR (NVL(to_char(:new.NETWORK_PROPERTIES),1)">!= NVL(to_char(:old.NETWORK_PROPERTIES),1)">OR (NVL(to_char(:new.POLICE_AREA_CODE),1)">!= NVL(to_char(:old.POLICE_AREA_CODE),1)">OR (NVL(to_char(:new.INSTALL_PERSION),1)">!= NVL(to_char(:old.INSTALL_PERSION),1)">OR (NVL(to_char(:new.INSTALL_TIME,1)">!= NVL(to_char(:old.INSTALL_TIME,1)">OR (NVL(to_char(:new.BUILD_PERIOD),1)">!= NVL(to_char(:old.BUILD_PERIOD),1)">OR (NVL(to_char(:new.PROJECT_NAME),1)">!= NVL(to_char(:old.PROJECT_NAME),1)">OR (NVL(to_char(:new.MANAGER_UNIT),1)">!= NVL(to_char(:old.MANAGER_UNIT),1)">OR (NVL(to_char(:new.MANAGER_UNIT_TEL),1)">!= NVL(to_char(:old.MANAGER_UNIT_TEL),1)">OR (NVL(to_char(:new.MAINTAIN_UNIT),1)">!= NVL(to_char(:old.MAINTAIN_UNIT),1)">OR (NVL(to_char(:new.MAINTAIN_UNIT_TEL),1)">!= NVL(to_char(:old.MAINTAIN_UNIT_TEL),1)">OR (NVL(to_char(:new.RECODE_SAVE_TYPE),1)">!= NVL(to_char(:old.RECODE_SAVE_TYPE),1)">OR (NVL(to_char(:new.DEVICE_STATE),1)">!= NVL(to_char(:old.DEVICE_STATE),1)">OR (NVL(to_char(:new.INDUSTRY_OWN),1)">!= NVL(to_char(:old.INDUSTRY_OWN),1)">OR (NVL(to_char(:new.IS_REGISTER_IMOS),1)">!= NVL(to_char(:old.IS_REGISTER_IMOS),1)">OR (NVL(to_char(:new.IS_WIFI),1)">!= NVL(to_char(:old.IS_WIFI),1)">OR (NVL(to_char(:new.IS_FLASH),1)">!= NVL(to_char(:old.IS_FLASH),1)">OR (NVL(to_char(:new.CAMERA_NO_STR),1)">!= NVL(to_char(:old.CAMERA_NO_STR),1)">OR (NVL(to_char(:new.CAMERA_VCN_CODE),1)">!= NVL(to_char(:old.CAMERA_VCN_CODE),1)">OR (NVL(to_char(:new.FIELD_NO),1)">!= NVL(to_char(:old.FIELD_NO),1)">OR (NVL(to_char(:new.KEY_UNIT),1)">!= NVL(to_char(:old.KEY_UNIT),1)">OR (NVL(to_char(:new.UNIT_TYPE),1)">!= NVL(to_char(:old.UNIT_TYPE),1)">OR (NVL(to_char(:new.SHOW_LEVEL),1)">!= NVL(to_char(:old.SHOW_LEVEL),1)">OR (NVL(to_char(:new.PROTOCOL_TYPE),1)">!= NVL(to_char(:old.PROTOCOL_TYPE),1)">OR (NVL(to_char(:new.CAMERA_PORT),1)">!= NVL(to_char(:old.CAMERA_PORT),1)">OR (NVL(to_char(:new.INTERFACE_TYPE),1)">!= NVL(to_char(:old.INTERFACE_TYPE),1)">OR (NVL(to_char(:new.CHANNEL),1)">!= NVL(to_char(:old.CHANNEL),1)">OR (NVL(to_char(:new.USER_OBJECT),1)">!= NVL(to_char(:old.USER_OBJECT),1)">OR (NVL(to_char(:new.IMG_PATH),1)">!= NVL(to_char(:old.IMG_PATH),1)">OR (NVL(to_char(:new.CAMERA_DESC),1)">!= NVL(to_char(:old.CAMERA_DESC),1)">OR (NVL(to_char(:new.IS_REGISTER_VCN),1)">!= NVL(to_char(:old.IS_REGISTER_VCN),1)">OR (NVL(to_char(:new.IS_DEL),1)">!= NVL(to_char(:old.IS_DEL),1)">OR (NVL(to_char(:new.ORDER_VALUE),1)">!= NVL(to_char(:old.ORDER_VALUE),1)">OR (NVL(to_char(:new.POLLING_RESULT),1)">!= NVL(to_char(:old.POLLING_RESULT),1)">OR (NVL(to_char(:new.SERVER_ID),1)">!= NVL(to_char(:old.SERVER_ID),1)">OR (NVL(to_char(:new.SHORT_MSG),1)">!= NVL(to_char(:old.SHORT_MSG),1)">OR (NVL(to_char(:new.CAMERA_BELONGS_ID),1)">!= NVL(to_char(:old.CAMERA_BELONGS_ID),1)">OR (NVL(to_char(:new.RELATED_CUSTOMS),1)">!= NVL(to_char(:old.RELATED_CUSTOMS),1)">OR (NVL(to_char(:new.ADDED_TO_SDE),1)">!= NVL(to_char(:old.ADDED_TO_SDE),1)">OR (NVL(to_char(:new.CAMERA_BAK),1)">!= NVL(to_char(:old.CAMERA_BAK),1)">OR (NVL(to_char(:new.CAMERA_BELONGS_PK),1)">!= NVL(to_char(:old.CAMERA_BELONGS_PK),1)">OR (NVL(to_char(:new.MEMBERBAR_CODE),1)">!= NVL(to_char(:old.MEMBERBAR_CODE),1)">OR (NVL(to_char(:new.IS_BRANCH),1)">!= NVL(to_char(:old.IS_BRANCH),1)">OR (NVL(to_char(:new.IS_WATCHPOS),1)">!= NVL(to_char(:old.IS_WATCHPOS),1)">OR (NVL(to_char(:new.CAMERA_ANGLE),1)">!= NVL(to_char(:old.CAMERA_ANGLE),1)">OR (NVL(to_char(:new.CROSS_ARM3),1)">!= NVL(to_char(:old.CROSS_ARM3),1)">OR (NVL(to_char(:new.IS_SYS),1)">!= NVL(to_char(:old.IS_SYS),1)">OR (NVL(to_char(:new.RECORD_TIME),1)">!= NVL(to_char(:old.RECORD_TIME),1)">OR (NVL(to_char(:new.ANALYSIS_NO),1)">!= NVL(to_char(:old.ANALYSIS_NO),1)">OR (NVL(to_char(:new.WIFI_STATE),1)">!= NVL(to_char(:old.WIFI_STATE),1)">OR (NVL(to_char(:new.FACE_TASK_STATUS),1)">!= NVL(to_char(:old.FACE_TASK_STATUS),1)">OR (NVL(to_char(:new.VIDEO_TASK_STATUS),1)">!= NVL(to_char(:old.VIDEO_TASK_STATUS),1)">OR (NVL(to_char(:new.BAYONET_TASK_STATUS),1)">!= NVL(to_char(:old.BAYONET_TASK_STATUS),1)">OR (NVL(to_char(:new.VQD_URL),1)">!= NVL(to_char(:old.VQD_URL),1)">OR (NVL(to_char(:new.SYS_TYPE),1)">!= NVL(to_char(:old.SYS_TYPE),1)">OR (NVL(to_char(:new.IS_HAVE_CAPTURE),1)">!= NVL(to_char(:old.IS_HAVE_CAPTURE),1)">)) THEN UPDATEEND IF; "T_PT_CAMERA_INFO_D" BEFORE DELETE DELETE "T_VIDEO_VIDEOSOURCE_I" AFTER ON "SHINY"."VIPF_VIDEO_VIDEOSOURCE" VIPF_VIDEO_VIDEOSOURCECAMERA_ID "T_VIDEO_VIDEOSOURCE_U" AFTER "T_VIDEO_VIDEOSOURCE_D" BEFORE END;
启动数据同步任务C#代码:
using DataSync.DAL; DataSync.Utils; Utils; System; System.Collections.Generic; System.ComponentModel; System.Configuration; System.Data; System.Diagnostics; System.Linq; System.ServiceProcess; System.Text; System.Threading; System.Threading.Tasks; System.Timers; System.Windows.Forms; Quartz.Impl; Quartz; DataSync.Jobs; Models; namespace DataSync { /// <summary> /// 数据同步服务 by suxiang </summary> partial class DataSyncService : ServiceBase { #region 变量 #endregion #region 构造函数 public DataSyncService() { InitializeComponent(); } #region OnStart 启动服务 protected override void OnStart(string[] args) { startScheduler(); LogUtil.Log("服务启动成功"); } #region OnStop 停止服务 void OnStop() { LogUtil.Log(服务停止成功); Thread.Sleep(100); //等待一会,待日志写入文件 } #region Start 启动服务 public Start() { OnStart(null#region scheduleJob private async startScheduler() { TaskSchedulerEx taskEx = new TaskSchedulerEx(8,1)">64); StdSchedulerFactory schedulerFactory = new StdSchedulerFactory(); IScheduler scheduler = await schedulerFactory.GetScheduler(); scheduler.Start(); await LogUtil.Log(任务调度器已启动); if (ConfigUtil.SyncParam == 1) 部署在政务网侧 { scheduleJob(scheduler,政务网中间库->政务网平台库政务网平台库->政务网中间库2) 部署在视频网侧 视频网平台库->视频网中间库figUtil.SPW_PT,ConfigUtil.SPW_Middle,taskEx); } } void scheduleJob(IScheduler scheduler,string taskName,1)">string dbSourceConnectionString,1)"> dbTargetConnectionString,TaskSchedulerEx taskEx) { string cronString = 0/5 * * * * ?; IJobDetail jobDetail = JobBuilder.Create<SyncJob>().Build(); ITrigger trigger = TriggerBuilder.Create().WithCronSchedule(cronString).Build(); SpeedInfo speedInfo = SpeedInfo(); jobDetail.JobDataMap.Put(taskNamedbSourceConnectionStringdbTargetConnectionStringspeedInfotaskEx scheduler.ScheduleJob(jobDetail,trigger); scheduleCalcSpeedJob(scheduler,taskName,speedInfo); } async Task scheduleCalcSpeedJob(IScheduler scheduler,1)"> taskName,SpeedInfo speedInfo) { int timeRange = 10; 0/" + timeRange + * * * * ?; IJobDetail jobDetail = JobBuilder.Create<CalcSpeedJob> TriggerBuilder.Create().WithCronSchedule(cronString).Build(); jobDetail.JobDataMap.Put(timeRange#endregion } }
数据同步任务C#代码:
DataSync.Models; Models; Oracle.ManagedDataAccess.Client; System.Collections; Utils; DataSync.Jobs { 数据同步任务 </summary> [disallowConcurrentExecution] SyncJob : IJob { #region 变量属性 readonly string INSERT = INSERT; string UPDATE = UPDATEstring DELETE = DELETE#region 数据库操作类 private OracleHelper _dbSource = private OracleHelper _dbTarget = #region 任务参数 string _taskName = string _dbSourceConnectionString = string _dbTargetConnectionString = private SpeedInfo _speedInfo = private TaskSchedulerEx _task = Task Execute(IJobExecutionContext context) { return Task.Run(() => { try { _taskName = context.JobDetail.JobDataMap[].ToString(); _dbSourceConnectionString = context.JobDetail.JobDataMap[].ToString(); _dbTargetConnectionString = context.JobDetail.JobDataMap[].ToString(); _speedInfo = (SpeedInfo)context.JobDetail.JobDataMap[]; _task = (TaskSchedulerEx)context.JobDetail.JobDataMap[]; _dbSource = OracleHelper(_dbSourceConnectionString); _dbTarget = OracleHelper(_dbTargetConnectionString); List<SYNC_DATA> list = ServiceHelper.Get<SyncDataDal>().GetList(_dbSourceConnectionString); int oldCount = list.Count; list = DictinctSyncData(list); if (oldCount > 0 && oldCount != list.Count) LogUtil.Log(string.Format(SYNC_DATA集合去重前数量:{0} 去重后数量:{1}string,List<SYNC_DATA>> dict = list.ToLookup(a => a.TABLE_NAME).ToDictionary(a => a.Key,a => a.ToList()); 按表分组,对于单张表,必须用单线程,保证处理顺序 int syncCount = 0; object lockObj = new object(); List<Task> taskList = new List<Task>(); foreach (string key in dict.Keys) { foreach (SYNC_DATA item dict[key]) { Task task = _task.Run((obj) => { SYNC_DATA syncData = obj as SYNC_DATA; string targetTableName = syncData.TABLE_NAME; 表名不一至的特殊情况 { if (syncData.TABLE_NAME == VIPF_VIDEO_VIDEOSOURCE") targetTableName = ZZ_VIDEO_VIDEOSOURCE1; } 查询并缓存目标数据库表字段信息集合 List<DbColumnInfo> columnList = MemoryCacheUtil.TryGetValue<List<DbColumnInfo>>(_dbSourceConnectionString + targetTableName,() => _dbTarget.GetAllColumns(targetTableName)); int row; SyncOneData(_dbSourceConnectionString,(SYNC_DATA)syncData,targetTableName,_dbSource,_dbTarget,columnList,1)">out row); lock (lockObj) { syncCount += row; } _speedInfo.addCount(); },item); taskList.Add(task); } } Task.WaitAll(taskList.ToArray()); if (syncCount > 0) LogUtil.Log(本次成功同步 {0} 条数据catch (Exception ex) { LogUtil.Error(ex,1)">数据同步任务 出错); } }); } #region 同步一条数据 <summary> 同步一条数据 </summary> void SyncOneData(string connStr,SYNC_DATA item,1)">string targetTableName,OracleHelper dbSource,OracleHelper dbTarget,List<DbColumnInfo> columnList,1)">out row) { bool isFault = false; DateTime dt = DateTime.Now; row = ; #region 通过表名查询字段集合 string columns = string.Join(",columnList.ConvertAll<string>(a => a.columns_name)); string columnsForInsert = string>(a => :" +string columnsForUpdate = string>(a => a.columns_name + =:#endregion if (item.COMMAND == INSERT || item.COMMAND == UPDATE) { 数据查询 DataTable sourceData = dbSource.Query(@"select * from {0} where {1}判断摄像机表是否需要同步 if (item.TABLE_NAME == PT_CAMERA_INFO) { if (!needSync(sourceData,targetData)) { ServiceHelper.Get<SyncDataDal>().DeleteById(connStr,item.ID); return; } } if (sourceData != null && sourceData.Rows.Count > bool exists = targetData != null && targetData.Rows.Count > ; if ((item.COMMAND == INSERT && !exists) || (item.COMMAND == UPDATE && !exists)) { #region 插入数据 string insertsql = insert into {0}({1}) values({2})#region 字段赋值 OracleParameter[] paramArr = OracleParameter[columnList.Count]; for (int i = 0; i < columnList.Count; i++) { DbColumnInfo columnInfo = columnList[i]; paramArr[i] = OracleParameter(columnInfo.columns_name,GetColumnData(sourceData,columnInfo.columns_name)); } row = dbTarget.Executesql(insertsql,paramArr); if (row > {0} 表 {1} 插入一条数据,{2} } if ((item.COMMAND == INSERT && exists) || (item.COMMAND == UPDATE && exists)) { #region 更新数据 string updatesql = update {0} set {1} where {2} List<OracleParameter> paramList = new List<OracleParameter>(); foreach (DbColumnInfo columnInfo columnList) { paramList.Add( dbTarget.Executesql(updatesql,paramList.ToArray()); {0} 表 {1} 更新一条数据,{2} } } } if (item.COMMAND == DELETE) { #region 删除数据 string deletesql = delete from {0} where {1} dbTarget.Executesql(deletesql); {0} 表 {1} 删除一条数据,{2} } ServiceHelper.Get<SyncDataDal> (Exception ex) { isFault = true; LogUtil.Error(ex,1)">同步数据失败,表名:" + item.TABLE_NAME.toupper() + 命令:" + item.COMMAND + 数据ID: item.DATA_ID); } if (isFault) { SYNC_DATA sysSyncBs = ServiceHelper.Get<SyncDataDal>().GetById(connStr,item.ID); sysSyncBs.FAIL_COUNT++; ServiceHelper.Get<SyncDataDal>().Update(connStr,sysSyncBs); LogUtil.Debug(更新业务数据同步表SYNC_DATA,ID: item.ID); } } (Exception ex) { LogUtil.Error(ex,1)">更新业务数据同步表SYNC_DATA出错); } } #region 判断是否是主键 判断是否是主键 bool IsIdField(string columnName,1)"> idField) { if (idField.IndexOf('') >= ) { string[] idFieldArr = idField.Split(); return idFieldArr.ToList().Exists(a => a == columnName); } elsereturn columnName == idField; } } #region 根据主键生成Where条件语句 根据主键生成Where条件语句 string CreateWhere(string idField,1)"> idData) { ) { StringBuilder sb = new StringBuilder( 1=1 string[] idDataArr = idData.Split(0; i < idFieldArr.Length; i++) { sb.AppendFormat( and {0}='{1}' sb.ToString(); } return {0}='{1}'#region 根据字段名从DataTable中获取数据 根据字段名从DataTable中获取数据 object GetColumnData(DataTable data,1)"> columnName) { 0; i < data.Columns.Count; i++if (data.Columns[i].ColumnName == columnName) { return data.Rows[][data.Columns[i]]; } } dbnull.Value; } #region 根据主键生成Where条件语句日志信息 根据主键生成Where条件语句日志信息 string CreateWhereLog() { List<string> list = new List<string>(); ) { list.Add({0}:{1},#region 判断是否需要同步 bool needSync(DataTable sourceTable,DataTable targetTable) { HashSet<string> hashSet = new HashSet<string>() { POLLING_TIMECAMERA_STATE }; if (targetTable == null || targetTable.Rows.Count == 0) if (sourceTable != null && sourceTable.Rows.Count > 0 && targetTable != null && targetTable.Rows.Count > foreach (DataColumn column sourceTable.Columns) { (targetTable.Columns.Contains(column.ColumnName)) { if (sourceTable.Rows[0][column.ColumnName] != null && !sourceTable.Rows[0][column].Equals(targetTable.Rows[][column.ColumnName])) { hashSet.Contains(column.ColumnName)) { ; } } } } } ; } #region SYNC_DATA集合去重,对于按条件相同的数据,按顺序保留最后一条 SYNC_DATA集合去重,按顺序保留最后一条 private List<SYNC_DATA> DictinctSyncData(List<SYNC_DATA> list) { List<SYNC_DATA> result = new List<SYNC_DATA>(); 0; i < list.Count; i++) { SYNC_DATA dataI = list[i]; bool exists = ; int j = i + 1; j < list.Count; j++) { SYNC_DATA dataJ = list[j]; if (dataI.TABLE_NAME == dataJ.TABLE_NAME && dataI.TABLE_KEY == dataJ.TABLE_KEY && dataI.DATA_ID == dataJ.DATA_ID) { exists = ; } } exists) { result.Add(dataI); } } result; } } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。