SOSN5800光线保护器OLP-森润达光纤通信传输设备

关于光线保护器OLP的介绍:
 
工作原理
 
- 1+1保护模式:发送端通过分光器向主备链路同时传输信号,接收端根据光功率状态选择最优路径。
- 1:1保护模式:主链路传输业务信号,备链路传输检测信号,当主链路出现故障时,通过光开关切换至备用通道。
 
功能特点
 
- 故障监测与自动切换:实时监测工作光纤和备用光纤上的光功率,当工作光纤光功率低于设定阈值,自动切换到备用光纤,实现毫秒级快速切换,保障通信无阻断。
- 信号透明传输:工作在光层,对传输信号独立透明,不影响信号的格式、速率和协议等,可兼容多种光通信系统。
- 高可靠性与稳定性:采用冗余设计和高可靠性的组件,具备故障自诊断和恢复能力,可在恶劣环境下稳定工作。
- 灵活配置与管理:支持多种保护方式和光纤类型,可根据需求灵活配置,还可通过SNMP协议等实现远程网管,支持CLI、Web及图形化界面管理。
 
应用领域
 
- 电信网络:用于保护长途干线、城域网、接入网等光纤线路和设备,确保通信信号的稳定传输。
- 电力系统:保护电力光纤通信网络中的光纤线路免受电力系统中各种过电压、过电流以及电磁干扰的影响。
- 工业自动化:在工业生产的自动化控制系统中,保护光纤传输线路,确保生产过程中数据传输稳定。
 
技术参数
 
- 波长范围:一般在1260nm至1650nm之间,常见的测试波长为1310nm和1550nm。
- 插入损耗:一般要求Tx<1.5dB,Rx<1.5dB。
- 切换时间:通常≤25ms,部分高性能设备可达到≤15ms。
- 串扰:一般要求Sm≥50dB。
 
设备组成
 
- 硬件部分:包括光纤接口、数据接口、电源等,用于接收和发送光信号,为整个系统提供电力。
- 软件部分:包括动态环路保护算法、自动倒换算法等软件算法,实现光纤网络的保护和自动倒换功能。

using MESCommon; using MesDataSource; using MESDTO; using MySqlConnector; using System; using System.Collections.Generic; using System.Configuration; using System.Data; using System.Globalization; using System.Linq; using System.Text; namespace MESBusiness.InterfaceImpl { class ptPushWorkReportDataToCostSys : BusinessService { IPTDataSource source = PTDataSourceFactory.CreateDataSourceService(); private static object locker = new object(); DataTable appendDt = new DataTable();//工作中心为空的数据,后续需要补推 string msg = ""; string tomailAd = "yangling@silanic.cn;zhouxun@silanic.cn";//执行异常邮件通知人 SubmitResult returnValue = new SubmitResult() { ResultCode = "1", ResultMsg = "", Count = 0 }; protected override SubmitResult Execute(Dictionary<string, string> paras) { lock (locker) { //1.按时间查询时间段内尚未推送的数据,组装数据 string serviceID = this.GetType().FullName; //DateTime date = source.GetDataLastDateByJobKey(serviceID); //string startTime = date.ToString("yyyy-MM-dd HH:mm:ss"); //string toTime = date.AddHours(2).ToString("yyyy-MM-dd HH:mm:ss"); string startTime = "2025-09-30 00:00:00"; string toTime = "2025-10-01 00:00:00"; for (int i = 0; i <= 30; i++) { startTime = DateTime.ParseExact(startTime, "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture).AddDays(1).ToString("yyyy-MM-dd HH:mm:ss"); toTime = DateTime.ParseExact(startTime, "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture).AddDays(1).ToString("yyyy-MM-dd HH:mm:ss"); updateAndInsert(startTime, toTime, "dxdsConnectionStr2111", "2111", false); updateAndInsert(startTime, toTime, "dxdsconnectionstr2041", "2041", false); updateAndInsert(startTime, toTime, "dxdsConnectionStr2041", "2041", true); } if (appendDt.Rows.Count > 0) { var htmlBody = EmailHelper.ConvertDatatableToHtml(appendDt); EmailHelper.SendEmail("172.17.1.40", "fatest@silanic.cn", "fatest@silanic.cn", "abc#123", tomailAd, "", "补推推送报成本系统报工数据", $@"{startTime}-{toTime}时间段需要补推<br/>{htmlBody}", "", true, ref msg); } if (returnValue.ResultCode.Equals("1")) { DateTimeFormatInfo dtFormat = new DateTimeFormatInfo(); dtFormat.ShortDatePattern = "yyyy-MM-dd HH:mm:ss"; //发送成功更新参数 //source.UpdateDataLastDateByJobKey(serviceID, Convert.ToDateTime(toTime, dtFormat)); } return returnValue; } } private void updateAndInsert(string startTime, string toTime, string conStr, string factroy, bool is_WY) { var batchSize = 1000; DateTimeFormatInfo dtFormat = new DateTimeFormatInfo(); dtFormat.ShortDatePattern = "yyyy-MM-dd HH:mm:ss"; DataTable dt = new DataTable(); DataTable patchTable = new DataTable();//工作中心为空,但能查出工作中心的数据 if (is_WY) { var wySql = $@" select DISTINCT unid,post_date,post_time,procedure_code,plant_code,work_plant ,rTRIM(sosn) as sosn,rTRIM(prd_mat_code) as prd_mat_code,rTRIM(prodosn) as prodosn ,substring(prodosn,1,4) as prodo_type,rTRIM(lot_id) as lot_id,rTRIM(lot_type) as lot_type ,lot_qty,track_sn,track_sn_qty,track_sn_type,step_id,rTRIM(step_desc) as step_desc ,rTRIM(step_text) as step_text,process_flag,work_center,rTRIM(equipment_id) as equipment_id ,rTRIM(recipe_code) as recipe_code,act_reason1_qty,'MIN' as act_reason1_uom,act_reason2_qty ,'KWH' as act_reason2_uom,act_reason3_qty,'L' as act_reason3_uom,confirm_qty,scrap_qty ,rework_qty,scrap_die,rework_die,reason,operater,bas_unit_code,reserved1,reserved2 ,reserved3 from WorkReportData where TXN_DATE >= convert(datetime,'{startTime}',120) and TXN_DATE < convert(datetime,'{toTime}',120) and prodosn is not null and IS_PUSHED !='1' and prd_mat_code is not null and (work_center IS not NULL and work_center!='')"; dt = source.QueryFromWyMES(wySql); } else { var odsSql = $@"SELECT UNID,POST_DATE,POST_TIME,PROCEDURE_CODE,PLANT_CODE,WORK_PLANT,SOSN,PRD_MAT_CODE,PRODOSN ,substr(PRODOSN,0,4) as PRODO_TYPE,LOT_ID,LOT_TYPE,LOT_QTY,TRACK_SN,TRACK_SN_QTY,TRACK_SN_TYPE ,STEP_ID,STEP_DESC,STEP_TEXT,PROCESS_FLAG,WORK_CENTER,EQUIPMENT_ID,RECIPE_CODE,ACT_REASON1_QTY ,ACT_REASON1_UOM,ACT_REASON2_QTY,ACT_REASON2_UOM,ACT_REASON3_QTY,ACT_REASON3_UOM,CONFIRM_QTY ,SCRAP_QTY,REWORK_QTY,CONFIRM_DIE,SCRAP_DIE,REWORK_DIE,REASON,OPERATER,BAS_UNIT_CODE,WAFER_NUMBER ,RESERVED1,RESERVED2,RESERVED3,GENERAL_NOTES FROM CAMSTARADMIN.PT_WORK_REPORT_DATA pwrd where PRD_MAT_CODE is not null and PRODOSN is not null and nvl(IS_PUSHED,0)!=1 AND PLANT_CODE = '{factroy}' and TXN_DATE >= to_date('{startTime}','yyyy-MM-dd hh24:mi:ss') and TXN_DATE < to_date('{toTime}','yyyy-MM-dd hh24:mi:ss') and WORK_CENTER is not null"; dt = source.QueryFromCamstar(odsSql); var odsSqlpatch = $@"SELECT UNID,POST_DATE,POST_TIME,PROCEDURE_CODE,PLANT_CODE,WORK_PLANT,SOSN,PRD_MAT_CODE,PRODOSN ,substr(PRODOSN,0,4) as PRODO_TYPE,LOT_ID,LOT_TYPE,LOT_QTY,TRACK_SN,TRACK_SN_QTY,TRACK_SN_TYPE ,STEP_ID,STEP_DESC,STEP_TEXT,PROCESS_FLAG,WORK_CENTER,EQUIPMENT_ID,RECIPE_CODE,ACT_REASON1_QTY ,ACT_REASON1_UOM,ACT_REASON2_QTY,ACT_REASON2_UOM,ACT_REASON3_QTY,ACT_REASON3_UOM,CONFIRM_QTY ,SCRAP_QTY,REWORK_QTY,CONFIRM_DIE,SCRAP_DIE,REWORK_DIE,REASON,OPERATER,BAS_UNIT_CODE,WAFER_NUMBER ,RESERVED1,RESERVED2,RESERVED3,GENERAL_NOTES FROM CAMSTARADMIN.PT_WORK_REPORT_DATA pwrd where PRD_MAT_CODE is not null and PRODOSN is not null and nvl(IS_PUSHED,0)!=1 AND PLANT_CODE = '{factroy}' and TXN_DATE >= to_date('{startTime}','yyyy-MM-dd hh24:mi:ss') and TXN_DATE < to_date('{toTime}','yyyy-MM-dd hh24:mi:ss') and WORK_CENTER is null "; patchTable = source.QueryFromCamstar(odsSqlpatch); } #region 处理工作中心为空的数据 if (patchTable != null && patchTable.Rows.Count > 0) { for (int i = patchTable.Rows.Count - 1; i >= 0; i--) { DataRow row = patchTable.Rows[i]; if (row.IsNull("WORK_CENTER")) { string workCenter = getWorkCenter(row); if (string.IsNullOrEmpty(workCenter)) { appendDt.ImportRow(row); patchTable.Rows.Remove(row); } else { row["WORK_CENTER"] = workCenter; } } } patchTable.AcceptChanges(); } #endregion if (patchTable != null && patchTable.Rows.Count > 0) dt.Merge(patchTable); if (dt == null || dt.Rows.Count == 0) return; #region 推送数据到成本系统,一次性全部插入。 using (var conn = new MySqlConnection(ConfigurationManager.AppSettings[conStr]))//2111 { conn.Open(); using (var transaction = conn.BeginTransaction()) { try { int totalRows = dt.Rows.Count; int batchCount = (int)Math.Ceiling((double)totalRows / batchSize); for (int batchIndex = 0; batchIndex < batchCount; batchIndex++) { StringBuilder sqlBuilder = new StringBuilder(); using (MySqlCommand cmd = conn.CreateCommand()) { cmd.Transaction = transaction; // 构建基础SQL if (factroy == "2041") { if (is_WY) { sqlBuilder.AppendLine($@"INSERT INTO co_etl_work_report_2041 ( unid, post_date, post_time, procedure_code, plant_code, work_plant, sosn, prd_mat_code, prodosn, prodo_type, lot_id, lot_type, lot_qty , track_sn, track_sn_qty, track_sn_type, step_id, step_desc, step_text, process_flag, work_center, equipment_id, recipe_code, act_reason1_qty , act_reason1_uom, act_reason2_qty, act_reason2_uom, act_reason3_qty, act_reason3_uom, confirm_qty, scrap_qty, rework_qty, scrap_die , rework_die, reason, operater, bas_unit_code, reserved1, reserved2, reserved3) VALUES "); } else { sqlBuilder.AppendLine($@"INSERT INTO co_etl_work_report_2041 ( unid, post_date, post_time, procedure_code, plant_code, work_plant, sosn, prd_mat_code, prodosn, prodo_type, lot_id, lot_type, lot_qty , track_sn, track_sn_qty, track_sn_type, step_id, step_desc, step_text, process_flag, work_center, equipment_id, recipe_code, act_reason1_qty , act_reason1_uom, act_reason2_qty, act_reason2_uom, act_reason3_qty, act_reason3_uom, confirm_qty, scrap_qty, rework_qty, confirm_die, scrap_die , rework_die, reason, operater, bas_unit_code, wafer_number, reserved1, reserved2, reserved3, general_notes) VALUES "); } } else { sqlBuilder.AppendLine(@"INSERT INTO co_etl_work_report_2111 ( unid, post_date, post_time, procedure_code, plant_code, work_plant, sosn, prd_mat_code, prodosn, prodo_type, lot_id, lot_type, lot_qty , track_sn, track_sn_qty, track_sn_type, step_id, step_desc, step_text, process_flag, work_center, equipment_id, recipe_code, act_reason1_qty , act_reason1_uom, act_reason2_qty, act_reason2_uom, act_reason3_qty, act_reason3_uom, confirm_qty, scrap_qty, rework_qty, confirm_die, scrap_die , rework_die, reason, operater, bas_unit_code, wafer_number, reserved1, reserved2, reserved3, general_notes) VALUES "); } int startRow = batchIndex * batchSize; int endRow = Math.Min(startRow + batchSize, totalRows); // 动态生成参数化VALUES for (int rowIndex = startRow; rowIndex < endRow; rowIndex++) { DataRow row = dt.Rows[rowIndex]; sqlBuilder.Append("("); // 为当前行所有列生成参数 for (int colIndex = 0; colIndex < dt.Columns.Count; colIndex++) { string paramName = $"@p_{rowIndex}_{colIndex}"; sqlBuilder.Append(paramName); if (colIndex < dt.Columns.Count - 1) sqlBuilder.Append(", "); // 添加参数值 object value = row[colIndex]; cmd.Parameters.AddWithValue( paramName, value == DBNull.Value ? null : value ); } sqlBuilder.Append("),"); } // 移除最后一个逗号 sqlBuilder.Length--; cmd.CommandText = sqlBuilder.ToString(); // 执行批量插入 var affectedRows = cmd.ExecuteNonQuery(); //更新MES int resultQty = 0; var unidList = dt.AsEnumerable().Select(row => row["UNID"]).ToList(); for (int i = 0; i < unidList.Count; i += 1000) { var batch = unidList.Skip(i).Take(1000).ToList(); if (is_WY) { var updateSql = $@"update WorkReportData set IS_PUSHED = 1 where UNID IN('{string.Join("','", batch)}') and TXN_DATE >= convert(datetime,'{startTime}',120) and TXN_DATE < convert(datetime,'{toTime}',120)"; resultQty = source.UpdateToWY(updateSql);//正式环境需要插入外延数据库 } else { var updateSql = $@"update PT_WORK_REPORT_DATA set IS_PUSHED = 1 where UNID IN('{string.Join("','", batch)}') and TXN_DATE >= to_date('{startTime}','yyyy-MM-dd hh24:mi:ss') and TXN_DATE < to_date('{toTime}','yyyy-MM-dd hh24:mi:ss')"; resultQty = source.UpdateToCamstar(updateSql); } if (resultQty < 0) break; resultQty += resultQty; } if (resultQty > 0) { transaction.Commit(); returnValue.Count += dt.Rows.Count; } } } } catch (Exception ex) { // 回滚事务 transaction.Rollback(); returnValue.ResultMsg = ex.Message; returnValue.ResultCode = "0"; returnValue.DontSaveLog = false; //发送失败推送邮件 string msg = ""; EmailHelper.SendEmail("172.17.1.40", "fatest@silanic.cn", "fatest@silanic.cn", "abc#123", tomailAd, "", "推送报成本系统报工数据", $@"{startTime}-{toTime}时间段推送异常{ex.Message}", "", true, ref msg); return; } } conn.Close(); } #endregion } private string getWorkCenter(DataRow row) { var workCenter = ""; var factoryname = row["PLANT_CODE"]; var resourcename = row["EQUIPMENT_ID"]; var spec = row["STEP_TEXT"]; if (DBNull.Value.Equals(factoryname) || factoryname.Equals("")) return workCenter; //没有设备则取工序绑定的设备组中随机设备的工作中心 if (DBNull.Value.Equals(resourcename) || resourcename.Equals("")) { if (!DBNull.Value.Equals(spec) && !spec.Equals("")) { var sqlEqp = $@"select DISTINCT r.resourcename,w1.WORKCENTERNAME AS slworkcenter,w2.WORKCENTERNAME AS ptworkcenter from a_equipmentmatrix ap inner join spec sp on ap.specid = sp.specid inner join specbase spb on sp.specbaseid = spb.specbaseid inner join resourcegroup rp on ap.equipmentgroupid = rp.resourcegroupid INNER JOIN ResourceGroupEntries RGE ON rp.ResourceGroupId = RGE.ResourceGroupId INNER JOIN resourcedef r on r.ResourceId = rge.EntriesId LEFT JOIN WORKCENTER w1 ON w1.WORKCENTERID = r.PTWORKCENTERID LEFT JOIN WORKCENTER w2 ON W2.WORKCENTERID = r.PTWORKCENTER2ID WHERE specname ='{spec}' AND w1.WORKCENTERNAME IS NOT NULL AND w2.WORKCENTERNAME IS NOT null "; var dtEqp = source.QueryFromCamstar(sqlEqp); if (dtEqp != null & dtEqp.Rows.Count > 0) { workCenter = factoryname == "2041" ? dtEqp.Rows[0]["SLWORKCENTER"]?.ToString() : dtEqp.Rows[0]["PTWORKCENTER"]?.ToString(); } else { //测试中转库/模块测试中转库/成品包装/包装入库工序如果没绑定设备组,则设置默认工作中心 if (spec == "测试中转库") { workCenter = factoryname == "2041" ? "20411111" : "21110802"; } if (spec == "模块测试中转库") { workCenter = factoryname == "2041" ? "20411111" : ""; } if (spec == "成品包装") { workCenter = factoryname == "2041" ? "20411301" : "21111001"; } if (spec == "包装入库") { workCenter = factoryname == "2041" ? "20411301" : "21111002"; } } } } //有设备号则获取设备的工作中心 else { var sql = $@"select CASE WHEN {factoryname} ='2041' THEN w1.WORKCENTERNAME ELSE W2.WORKCENTERNAME end AS workcenter FROM camstaradmin.RESOURCEDEF r LEFT JOIN camstaradmin.WORKCENTER w1 ON w1.WORKCENTERID = r.PTWORKCENTERID LEFT JOIN camstaradmin.WORKCENTER w2 ON W2.WORKCENTERID = r.PTWORKCENTER2ID WHERE r.RESOURCENAME='{resourcename}' "; DataTable dt = source.QueryFromODS(sql); if (dt != null && dt.Rows.Count > 0) { workCenter = dt.Rows[0]["workcenter"]?.ToString(); } } return workCenter; } } } 这是我的代码 请分析错误原因
11-20
-- CAMSTARADMIN.PT_WORK_REPORT_DATA definition CREATE table "test"."PT_WORK_REPORT_DATA" ( "UNID" VARCHAR2(128), "POST_DATE" VARCHAR2(32), "POST_TIME" VARCHAR2(32), "PROCEDURE_CODE" VARCHAR2(12), "PLANT_CODE" VARCHAR2(12), "WORK_PLANT" VARCHAR2(12), "SOSN" VARCHAR2(32), "PRD_MAT_CODE" VARCHAR2(40), "PRODOSN" VARCHAR2(32), "PRODO_TYPE" VARCHAR2(6), "LOT_ID" VARCHAR2(48), "LOT_TYPE" VARCHAR2(16), "LOT_QTY" NUMBER, "TRACK_SN" VARCHAR2(32), "TRACK_SN_QTY" NUMBER, "TRACK_SN_TYPE" VARCHAR2(64), "STEP_ID" VARCHAR2(255), "STEP_DESC" VARCHAR2(64), "STEP_TEXT" VARCHAR2(80), "PROCESS_FLAG" VARCHAR2(12), "WORK_CENTER" VARCHAR2(32), "EQUIPMENT_ID" VARCHAR2(16), "RECIPE_CODE" VARCHAR2(48), "ACT_REASON1_QTY" NUMBER, "ACT_REASON1_UOM" VARCHAR2(12), "ACT_REASON2_QTY" NUMBER, "ACT_REASON2_UOM" VARCHAR2(12), "ACT_REASON3_QTY" NUMBER, "ACT_REASON3_UOM" VARCHAR2(12), "CONFIRM_QTY" NUMBER, "SCRAP_QTY" NUMBER, "REWORK_QTY" NUMBER, "CONFIRM_DIE" NUMBER, "SCRAP_DIE" NUMBER, "REWORK_DIE" NUMBER, "REASON" VARCHAR2(255), "OPERATER" VARCHAR2(12), "BAS_UNIT_CODE" VARCHAR2(12), "WAFER_NUMBER" VARCHAR2(32), "RESERVED1" VARCHAR2(32), "RESERVED2" VARCHAR2(32), "RESERVED3" VARCHAR2(32), "GENERAL_NOTES" VARCHAR2(64), "INSERT_TIME" DATE, "TXN_DATE" DATE, "IS_PUSHED" NUMBER(10,0) ) SEGMENT CREATION IMMEDIATE PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) TABLESPACE "TBS_CAMSTARDB" ;修改为mysql语句
10-23
try { int totalRows = dt.Rows.Count; int batchCount = (int)Math.Ceiling((double)totalRows / batchSize); for (int batchIndex = 0; batchIndex < batchCount; batchIndex++) { StringBuilder sqlBuilder = new StringBuilder(); using (MySqlCommand cmd = conn.CreateCommand()) { cmd.Transaction = transaction; // 构建基础SQL if (factroy == "2041") { if (is_WY) { sqlBuilder.AppendLine($@"INSERT INTO co_etl_main_consumption_2041 ( unid, prodosn, post_date, post_time, mat_code,procedure_code, move_type, plant_code, consump_plant, stor_loc_code, consump_qty, bas_unit_code, batch_sn, customer_code , stor_special_type, sosn, soln, track_sn,consump_die, wafer_number, system_name, general_notes,prd_mat_code,prod_name) VALUES "); } else { sqlBuilder.AppendLine($@"INSERT INTO co_etl_main_consumption_2041 ( unid, prd_mat_code, prod_name, prodosn, post_date, post_time, procedure_code, mat_code, move_type, plant_code, consump_plant, stor_loc_code, consump_qty, consump_die , bas_unit_code, batch_sn, customer_code, stor_special_type, sosn, soln, track_sn, general_notes) VALUES "); } } else { sqlBuilder.AppendLine(@"INSERT INTO co_etl_main_consumption_2111 ( unid, prd_mat_code, prod_name, prodosn, post_date, post_time, procedure_code, mat_code, move_type, plant_code, consump_plant, stor_loc_code, consump_qty, consump_die , bas_unit_code, batch_sn, customer_code, stor_special_type, sosn, soln, track_sn, general_notes) VALUES "); } int startRow = batchIndex * batchSize; int endRow = Math.Min(startRow + batchSize, totalRows); // 动态生成参数化VALUES for (int rowIndex = startRow; rowIndex < endRow; rowIndex++) { DataRow row = dt.Rows[rowIndex]; sqlBuilder.Append("("); // 为当前行所有列生成参数 for (int colIndex = 0; colIndex < dt.Columns.Count; colIndex++) { string paramName = $"@p_{rowIndex}_{colIndex}"; sqlBuilder.Append(paramName); if (colIndex < dt.Columns.Count - 1) sqlBuilder.Append(", "); // 添加参数值(处理DBNull) object value = row[colIndex]; cmd.Parameters.AddWithValue( paramName, value == DBNull.Value ? null : value ); } sqlBuilder.Append("),"); } // 移除最后一个逗号 sqlBuilder.Length--; cmd.CommandText = sqlBuilder.ToString(); // 执行批量插入 var affectedRows = cmd.ExecuteNonQuery(); } } transaction.Commit(); //更新MES int resultQty = 0; var unidList = dt.AsEnumerable().Select(row => row["UNID"]).ToList(); for (int i = 0; i < unidList.Count; i += 1000) { var batch = unidList.Skip(i).Take(1000).ToList(); if (is_WY) { var updateSql = $@"update MainConsumReportData set IS_PUSHED = 1 where UNID IN('{string.Join("','", batch)}') and TXN_DATE >= convert(datetime,'{startTime}',120) and TXN_DATE < convert(datetime,'{toTime}',120)"; resultQty = source.UpdateToWY(updateSql); } else { var updateSql = $@"update PT_MAIN_CONSUMPTION_DATA set IS_PUSHED = 1 where UNID IN('{string.Join("','", batch)}') and TXN_DATE >= to_date('{startTime}','yyyy-MM-dd hh24:mi:ss') and TXN_DATE < to_date('{toTime}','yyyy-MM-dd hh24:mi:ss"; resultQty = source.UpdateToCamstar(updateSql); } if (resultQty < 0) break; resultQty += resultQty; } if (resultQty > 0) { returnValue.Count += dt.Rows.Count; } } catch (Exception ex) { // 回滚事务 transaction.Rollback(); returnValue.ResultMsg = ex.Message; returnValue.ResultCode = "0"; //发送失败推送邮件 EmailHelper.SendEmail("172.17.1.40", "fatest@silanic.cn", "fatest@silanic.cn", "abc#123", tomailAd, "", "推送报成本系统主材耗用数据", $@"{startTime}-{toTime}时间段推送异常{ex.Message}", "", true, ref msg); return; }34Already committed or rolled back.
11-21
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值