public override int Update(DateTime startTime, DateTime endTime) { var result = 0; SourceConn.Open(); RelatedConn.Open(); //定义批处理的 var insertModels = new BaseModel[BatchNum]; var updateModels = new BaseModel[BatchNum]; var sourceCmd = new SqlCommand { Connection = SourceConn, CommandText = $@"select FNumber,FName,(select FName from t_SubMessage where t_SubMessage.FInterID=t_icitem.FErpClsID) FTypeName,(SELECT FName FROM T_MeasureUnit where T_MeasureUnit.FMeasureUnitID=t_icitem.FUnitID) unit, FModel,FLastCheckDate,FItemID from t_icitem where FNumber like '30%' ", // and FLastCheckDate between CONVERT(datetime, '{startTime}') and CONVERT(datetime, '{endTime}'), CommandTimeout = 0 }; var relatedCmd = new OracleCommand { Connection = RelatedConn, CommandText = "select ID||','||HashCode||','||sourceDb from Materiel where Code=:Code" }; relatedCmd.Parameters.Add(new OracleParameter("Code", OracleDbType.Char)); relatedCmd.Prepare(); var reader = sourceCmd.ExecuteReader(); var insertCmd = new OracleCommand() { Connection = RelatedConn, CommandText = GetInsertCmdText() }; var updateCmd = new OracleCommand() { Connection = RelatedConn, CommandText = GetUpdateCmdText() + $@" where Code=:Code" }; try { var i = 0; var j = 0; while (reader.Read()) { var materiel = new Materiel(); if (reader["FNumber"] == DBNull.Value) { continue; } materiel.Code = reader["FNumber"].ToString(); materiel.Name = reader["FName"].ToString(); materiel.Type = reader["FTypeName"].ToString(); materiel.BaseUnit = reader["unit"].ToString(); materiel.Specification = reader["FModel"].ToString(); materiel.Flag = 'C'; materiel.K3TimeStamp = DateTime.Now; materiel.SourceDb = Source.Name; materiel.CalculateHashCode(); materiel.K3WriteTime = DateTime.Now; relatedCmd.Parameters[0].Value = materiel.Code; var obj = relatedCmd.ExecuteScalar(); if (obj == null) { materiel.ID = Guid.NewGuid().ToString(); insertModels[i] = materiel; i++; if (i == BatchNum) { CommitBatch(insertCmd, insertModels); result += i; i = 0; insertModels = new BaseModel[BatchNum];//重置批 } } else { var arr = obj.ToString().Split(','); //对比哈希值决定是否需要更新 if (materiel.HashCode != arr[1]) { if (arr[2] != Source.Name && Source.Name != Configuration.Current.MainData) { continue; } log4net.LogManager.GetLogger("Logger").Info($"检测到物料更新【{materiel.Code}】"); materiel.ID = obj.ToString().Split(',')[0].ToString(); materiel.Flag = 'U'; updateModels[j] = materiel; j++; if (j == BatchNum) { CommitBatch(updateCmd, updateModels); result += j; j = 0; updateModels = new BaseModel[BatchNum];//重置批 } } } } if (i > 0) { var oddModels = new BaseModel[i]; for (int k = 0; k < i; k++) { oddModels[k] = insertModels[k]; } CommitBatch(insertCmd, oddModels); result += i; } if (j > 0) { var oddModels = new BaseModel[j]; for (int k = 0; k < j; k++) { oddModels[k] = updateModels[k]; } CommitBatch(updateCmd, oddModels); result += j; } reader.Close(); } catch (Exception e) { log4net.LogManager.GetLogger("Logger").Error(e.ToString() + "\r\n" + sourceCmd.CommandText + "\r\n" + insertCmd.CommandText + "\r\n" + updateCmd.CommandText); throw; } finally { SourceConn.Close(); RelatedConn.Close(); } return(result); }