背景
由于我们系统的数据没有更新,用户要求我们数据要跟另一个系统的作业同步,其实我是觉得那边作业完直接将我们的数据更新会更好,数据更新也会更实时(我们提供接口),奈何别人不愿意,而且别人是处于中央,于是就只能我们来调中间的一个系统提供的接口来更新数据。
其实我最想说的就是能不能提供批量更新接口,非要我一个一个循环丢。
分析
他们作业的数据是从我们系统下载的,但作业结果是在他们自己的系统里面的,所以我们
- 需要建立对应的栏位来接受更新的值,以及我们系统更新数据的时间
- 编写我们调用他接口的逻辑处理接口
- 查询我们系统需要check的数据(按时间段来,规定一个时间段,因为作业一般不会跨很久)
- 将需要check的数据丢进接口获取符合更新条件的人
- 将获取到的数据解析出来
- 更新数据状态和时间(可以执行多个SQL,开心,最开心就是这里了,终于会用了)
- 建立排程来定时执行
准备工作
- VS 2019 .Net Core
- 涉及到的dll
- Newtonsoft.Json(12.0.3 序列化用的)
- Dapper(2.0.35 据说是orm框架,但我还没怎么了解过,也没怎么用过)
- Oracle.ManagedDataAccess.Core(2.19.100 Oracle连接数据库的,免客户端安装,用连接字符串即可)
- 别人的接口
- 自己的数据源
数据难点(核心代码)
- 把json数组拿出来
- 序列化数据
获取到的数据格式如下,但红色的部分我不需要,只需要其他部分的
"<?xml version="1.0" encoding="utf-8"?>\r\n<string xmlns="http://tempuri.org/">[{"EMP_NO":"111123","EMP_NAME":"张三","isLeft":"true"}]</string>"
"<?xml version="1.0" encoding="utf-8"?>\r\n<string xmlns="http://tempuri.org/">[{"EMP_NO":"111123","EMP_NAME":"张三","isLeft":"true"}]</string>"
把json数组拿出来
// 调用接口获取数据(自己封装好的方法)
var data = HttpHelper.HttpGet("url");
// 将json数组捞出来
// 以数组的前后端为截取点,把数组截取出来(你也可以把固定的部分固定替换掉,但怕它变,虽然几率比较小)
int istart = data.IndexOf('[');
int iend = data.IndexOf(']');
data = data.Substring(istart, iend - istart + 1);
序列化数据
// 序列化json数组
var dd = JArray.Parse(data);
var obj = (JObject)dd[0];
string isLeft = obj.GetValue("isLeft").ToString();
执行多个SQL
因为在Oracle中in里面最多能放999个值,所以我就切分了一下,这个切分涉及到System.Linq语法
List<string> emps = new List<string>();
int i = emps.Count / 999;
for (int j = 0; j <= i; j++)
{
var temEmps = emps.Skip(j).Take(999);
_sqlDapper.QueryMultiple(@"begin
UPDATE TABLE1 SET JOBSTATUS ='已',RUNTIME = TO_CHAR(SYSDATE,'yyyy/mm/dd HH:mi:ss') WHERE EMP_NO in :emp;
UPDATE TABLE2 SET JOBSTATUS ='已',RUNTIME = TO_CHAR(SYSDATE,'yyyy/mm/dd HH:mi:ss') WHERE EMP_NO in :emp;
UPDATE TABLE3 SET JOBSTATUS ='已',RUNTIME = TO_CHAR(SYSDATE,'yyyy/mm/dd HH:mi:ss') WHERE EMP_NO in :emp;
end;" , new { emp = temEmps });
}
感谢亲爱的菲菲给我在截取方面的建议、序列化方面提供的支援,我对于数据结构、类型真的是太不敏感了,谢谢菲菲的指导!!!
参考文章
c#中执行多条sql语句【ORA-00911: 无效字符】_weixin_34176694的博客-CSDN博客