从口袋通(现在叫有赞)API获得订单数据(json格式,接口的说明见http://open.koudaitong.com/doc/api?method=kdt.trades.sold.get),每次可以返回数千个订单,每个订单数据包括订单的head部分,订单的明细部分。本人现在的做法比较土,如下
string ret = 获取json返回结果的方法;
//将json反序列化为JObject
JObject jo = (JObject)JsonConvert.DeserializeObject(ret);
//将订单结构转成JArray对象,阵列里面就是每一张订单数据
JArray ja = (JArray)JsonConvert.DeserializeObject(jo.First.First.Last.First.ToString());
然后对JArray做循环,每个订单的head写入订单head表,对每张订单里的明细部分再次转成JArray,逐条写入订单明细表。
这样做的速度很慢,求最快最方便的将订单数据写入到数据库的方法。
5
先解析SQL转成dataset。再用SqlBulkCopy批量插入
10
5
所谓“方便”,没有绝对的方便,你可能觉得“不写代码才最方便”。但是既然已经写完毕了,那么你何必要修改呢?整天纠结已经写完毕、运行得很好的代码,才是最“不方便”的行为。
假如是从“容易调试修改”的角度,那么使用强类型的.net业务实体对象(而不是JObjec、JArray)这可以保证代码比较清晰、易诊断问题。这就不是简单地图方便,而是考虑到修改维护的真正方便。
至于说“速度慢”,本人不知道有多慢?!这或许只是个借口吧。
本人不知道你是不是觉得写一条sql语句就不“方便了”。假如你不直接写sql语句然后在循环中重复使用,而是弄个什么datatable之类的,那可能是自找麻烦的。
20
你能否测试过,是把时间主要花在从 JArray 中读取数据或是写个 Insert 或 Update 语句上吗?
30
解析一条就插一条,数据库又是open又是close的,当然慢了~~
解析这个步骤,肯定花费不了多少时间的,原因是json本身就比xml要轻量,传输的数据量小很多。而且json是格式化的,容易解析。
瓶颈在IO而不是运算。
可以考虑解析到Array/List,然后定义数据库事务操作,通过事务进行批量更新。
或弄到一个强类型dataset中,使用自动生成的代码和方法进行更新(目测原理也是一条记录就一开一关的,所以要稍作修改,在更新前先手动open,更新完毕后再close,这样会跳过一开一关)。
20
批量插入或更新数据,SQL2008中有表值变量,用这个会快很多
5
json转换为DataTable操作方法,再将datatable更新到数据库中,
5
1.根据数据拼接sql,与数据库只交互一次
2.将json想办法转成datatable,用SqlBulkCopy (oracle用OracleBulkCopy,OracleBulkCopy不支持事务)
具体代码如下
SqlTransaction sqlTran = sqlConn.BeginTransaction(); SqlBulkCopy sbc = new SqlBulkCopy(sqlConn, SqlBulkCopyOptions.Default, sqlTran); sbc.BulkCopyTimeout = 3600; sbc.BatchSize = 50000; //一次更新的行数 foreach (DataColumn col in dtLog.Columns) { sbc.ColumnMappings.Add(col.ColumnName, col.ColumnName); } sbc.DestinationTableName = """ + this.SysParameter.DataBaseNodeCode + "".tbDataCheckLog"; sbc.WriteToServer(dtLog);