xml 导入到Orcale数据库中

qq_39556010 2018-11-27 06:14:31
刚上班的下班求教
已从webservice 获得 xml样式的string
xml返回数据条目不定 可能两条可能,三条
现在如何把数据插入到orcale中

获取的string

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Table>
<Column>
<RECORDID>$5B1353A8DE8629C84E2890F</RECORDID>
<ORDER_ID>$504F5643529E4D84B1C71F1</ORDER_ID>
<ORDERCODE>$20130924000000980</ORDERCODE>
<BUYERORGID>QJ20T0000201000015754422</BUYERORGID>
<BUYERNAME>解放军总医院</BUYERNAME>
<BUYEREASY>301医院</BUYEREASY>
<MEDICALNAME>烫疮油</MEDICALNAME>
<PRODUCTID>FR20T0000003000000124033</PRODUCTID>
<PRODUCTNAME>无</PRODUCTNAME>
<MEDICALMODE>油剂</MEDICALMODE>
<MEDICALSPEC>50ml×1瓶/瓶</MEDICALSPEC>
<METRICNAME>瓶</METRICNAME>
<FATORYID>FR20T0000004000000088552</FATORYID>
<FACTORYNAME>湖南邵阳华仁堂药业发展有限公司</FACTORYNAME>
<REQUESTQTY>1</REQUESTQTY>
<PRICE>62.91</PRICE>
<CREATEDATE>2013/9/24 18:16:21</CREATEDATE>
<DEGREE>1</DEGREE>
<ORDERREMARK>
</ORDERREMARK>
<REMARK>
</REMARK>
<WAREHOUSENAME>
</WAREHOUSENAME>
<COMPANY_ID>FR20T0000004000000066990</COMPANY_ID>
<DEPART_NAME>北京科园信海医药经营有限公司</DEPART_NAME>
<REPOSITORY_ID>0</ REPOSITORY_ID >
<BUYER_TYPE>0</BUYER_TYPE >

</Column>

<Column>
<RECORDID>$42E493211207A915CA4C3A5</RECORDID>
<ORDER_ID>$504F5643529E4D84B1C71F1</ORDER_ID>
<ORDERCODE>$20130924000000980</ORDERCODE>
<BUYERORGID>QJ20T0000201000015754422</BUYERORGID>
<BUYERNAME>解放军总医院</BUYERNAME>
<BUYEREASY>301医院</BUYEREASY>
<MEDICALNAME>烫疮油</MEDICALNAME>
<PRODUCTID>FR20T0000003000000124030</PRODUCTID>
<PRODUCTNAME>无</PRODUCTNAME>
<MEDICALMODE>油剂</MEDICALMODE>
<MEDICALSPEC>30ml×1瓶/瓶</MEDICALSPEC>
<METRICNAME>瓶</METRICNAME>
<FATORYID>FR20T0000004000000088552</FATORYID>
<FACTORYNAME>湖南邵阳华仁堂药业发展有限公司</FACTORYNAME>
<REQUESTQTY>3</REQUESTQTY>
<PRICE>45.80</PRICE>
<CREATEDATE>2013/9/24 18:16:21</CREATEDATE>
<DEGREE>1</DEGREE>
<ORDERREMARK>
</ORDERREMARK>
<REMARK>
</REMARK>
<WAREHOUSENAME>
</WAREHOUSENAME>
<COMPANY_ID>FR20T0000004000000066990</COMPANY_ID>
<DEPART_NAME>北京科园信海医药经营有限公司</DEPART_NAME>
<REPOSITORY_ID>0</ REPOSITORY_ID >
<BUYER_TYPE>0</BUYER_TYPE >
</Column>
<Column>
<RECORDID>$D4D5D0AFC99BAB998A913A2</RECORDID>
<ORDER_ID>$CA036FC81EA9AB5A980D301</ORDER_ID>
<ORDERCODE>$20130924000000950</ORDERCODE>
<BUYERORGID>FR20T0000005000000070123</BUYERORGID>
<BUYERNAME>解放军第302医院</BUYERNAME>
<BUYEREASY>302医院</BUYEREASY>
<MEDICALNAME>豨红通络口服液</MEDICALNAME>
<PRODUCTID>FR20T0000003000000132568</PRODUCTID>
<PRODUCTNAME>无</PRODUCTNAME>
<MEDICALMODE>合剂(含口服液)</MEDICALMODE>
<MEDICALSPEC>10ml×18/盒</MEDICALSPEC>
<METRICNAME>盒</METRICNAME>
<FATORYID>FR20T0000004000000077240</FATORYID>
<FACTORYNAME>通化卫京药业股份有限公司</FACTORYNAME>
<REQUESTQTY>5</REQUESTQTY>
<PRICE>138</PRICE>
<CREATEDATE>2013/9/24 14:54:06</CREATEDATE>
<DEGREE>1</DEGREE>
<ORDERREMARK>
</ORDERREMARK>
<REMARK>
</REMARK>
<WAREHOUSENAME>
</WAREHOUSENAME>
<COMPANY_ID>FR20T0000004000000066990</COMPANY_ID>
<DEPART_NAME>北京科园信海医药经营有限公司</DEPART_NAME>
<REPOSITORY_ID>0</ REPOSITORY_ID >
<BUYER_TYPE>0</BUYER_TYPE >
</Column>
<Column>
<RECORDID>$A816BBCD8AB46371D09F2B7</RECORDID>
<ORDER_ID>$423FAE5F20F1A74C6085A69</ORDER_ID>
<ORDERCODE>$20130924000000960</ORDERCODE>
<BUYERORGID>QJ20T0000201000015754422</BUYERORGID>
<BUYERNAME>解放军总医院</BUYERNAME>
<BUYEREASY>301医院</BUYEREASY>
<MEDICALNAME>烫疮油</MEDICALNAME>
<PRODUCTID>FR20T0000003000000124033</PRODUCTID>
<PRODUCTNAME>无</PRODUCTNAME>
<MEDICALMODE>油剂</MEDICALMODE>
<MEDICALSPEC>50ml×1瓶/瓶</MEDICALSPEC>
<METRICNAME>瓶</METRICNAME>
<FATORYID>FR20T0000004000000088552</FATORYID>
<FACTORYNAME>湖南邵阳华仁堂药业发展有限公司</FACTORYNAME>
<REQUESTQTY>3</REQUESTQTY>
<PRICE>62.91</PRICE>
<CREATEDATE>2013/9/24 16:05:27</CREATEDATE>
<DEGREE>1</DEGREE>
<ORDERREMARK>
</ORDERREMARK>
<REMARK>
</REMARK>
<WAREHOUSENAME>
</WAREHOUSENAME>
<COMPANY_ID>FR20T0000004000000066990</COMPANY_ID>
<DEPART_NAME>北京科园信海医药经营有限公司</DEPART_NAME>
<REPOSITORY_ID>0</ REPOSITORY_ID >
<BUYER_TYPE>0</BUYER_TYPE >
</Column>
</Table>

数据库表

字段名称 字段类型 字段说明
RECORDID CHAR(24) 订单明细ID,唯一主键(SQPTS)
ORDER_ID CHAR(24) 订单主表ID(SQPTS)
ORDERCODE VARCHAR2(50) 订单编码(SQPTS)
BUYERORGID VARCHAR2(50) 医院编码(ERP/SQPTS)
BUYERNAME VARCHAR2(100) 医院名称(SQPTS)
BUYEREASY VARCHAR2(100) 医院简称(SQPTS)
PRODUCTID VARCHAR2(50) 产品id(SQPTS)
PRODUCTNAME VARCHAR2(100) 商名称(SQPTS)
MEDICALMODE VARCHAR2(100) 药品剂型(SQPTS)
MEDICALSPEC VARCHAR2(150) 药品规格(SQPTS)
METRICNAME VARCHAR2(150) 药品单位(SQPTS)
MEDICALNAME VARCHAR2(150) 药品名称(SQPTS)
FATORYID CHAR(24) 生产企业编码(SQPTS)
FACTORYNAME VARCHAR2(150) 生产企业名称(SQPTS)
REQUESTQTY NUMBER(22,2) 订购数量(SQPTS)
PRICE NUMBER(22,3) 药品单价(SQPTS)
CREATEDATE DATE 医院发单时间(SQPTS)
ORDERREMARK VARCHAR2(1000) 主单备注(SQPTS)
REMARK VARCHAR2(1000) 明细备注(SQPTS)
WAREHOUSENAME VARCHAR2(100) 库房名称(SQPTS)
DEGREE CHAR(1) 紧急程度(SQPTS)
COMPANY_ID VARCHAR2(100) 供货商编码(SQPTS)
DEPART_NAME VARCHAR2(100) 供货商名称(SQPTS)
REPOSITORY_ID CHAR(24) 库房id(SQPTS)
BUTER_TYPE CHAR(1) 医院类别 1:二级以上医疗机构 0:社区医院



...全文
184 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
吉普赛的歌 2018-11-29
  • 打赏
  • 举报
回复
最稳妥的做法: 1. 用C# 调用语句
select * from table where 1=0  --table你换成目标表名
在 oracle 中查询,得到一个没有记录但是有结构 datatable。 2. 将 xml 转化成的有数据的 datatable 的数据一行行插入到上一步 空结构的 datatable 。 3. 执行 OracleBulkCopy 操作。
qq_39556010 2018-11-29
  • 打赏
  • 举报
回复
时间 列 和整数列需要特别处理吗
吉普赛的歌 2018-11-28
  • 打赏
  • 举报
回复
这个东西要求比较严格, 列的名称、大小写都必须对得上。 你自己再检查一次, 如果对不上的,用 ColumnMappings 自己专门定义一下。
吉普赛的歌 2018-11-28
  • 打赏
  • 举报
回复
https://www.cnblogs.com/JuneZhang/archive/2011/04/14/2016068.html xml => datatable, 再调用 OracleBulkCopy 将 datatable 插入到表就是了。
exception92 2018-11-28
  • 打赏
  • 举报
回复
很多种方式可以将xml转为实体数据集合,linq to xml http://blog.csdn.net/duanzi_peng/article/details/24018431
然后再插入数据库即可。
qq_39556010 2018-11-28
  • 打赏
  • 举报
回复
引用 7 楼 吉普赛的歌 的回复:
https://blog.csdn.net/jiadajing267/article/details/60962539

删除 datatable 多余的两列, 再按上面的方法插入就是了。
其实单条插入也可以, 只是用 OracleBulkCopy 会更快。



直接报 错误


using (OracleBulkCopy bulkCopy = new OracleBulkCopy(OracleConnectionString))
{
try
{
if (dt != null && dt.Rows.Count > 0)
{
bulkCopy.BatchSize = 50000;
bulkCopy.BulkCopyTimeout = 60;
bulkCopy.DestinationTableName =tableName;
for (int i = 0; i < dt.Columns.Count; i++)
{
string col = dt.Columns[i].ColumnName;
errColString += col + ",";
bulkCopy.ColumnMappings.Add(col, col);
}
//提交到服务器
oracleconn.Open();
bulkCopy.WriteToServer(dt);
}
return true;
}
catch (Exception ex)
{
string ss = ex.Message;
return false;
}
finally
{
GC.Collect();
}

}

}
吉普赛的歌 2018-11-28
  • 打赏
  • 举报
回复
https://blog.csdn.net/jiadajing267/article/details/60962539 删除 datatable 多余的两列, 再按上面的方法插入就是了。 其实单条插入也可以, 只是用 OracleBulkCopy 会更快。
qq_39556010 2018-11-28
  • 打赏
  • 举报
回复

引用 2 楼 吉普赛的歌 的回复:
https://www.cnblogs.com/JuneZhang/archive/2011/04/14/2016068.html

xml => datatable, 再调用 OracleBulkCopy 将 datatable 插入到表就是了。

大神现在 我的xml 已经转成了datable 但是比oraale数据库 多了两列 怎么用 调用 OracleBulkCopy 将 datatable 插入到表
望赐教
吉普赛的歌 2018-11-28
  • 打赏
  • 举报
回复
引用 4 楼 qq_39556010 的回复:
xml 比orcale 多了两列
无所谓呀, 你按我 #2 的, 得到了 datatable , 删除那两列就是了
qq_39556010 2018-11-28
  • 打赏
  • 举报
回复
xml 比orcale 多了两列
mingcsharp 2018-11-28
  • 打赏
  • 举报
回复
VS菜单中有个编辑然后找到特殊粘贴,可以直接把XML转成实体,这样你接收到的xml可以序列化成实体,有了实体你就可以往数据库中装了, 仅供参考

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧