C#/.NET使用HttpWebRequest、SqlBulkCopy从API获取数据批量插入DB
小弟新手程序员一枚,代码技术和文章水平均不才。所写文章均为对自己所写所学代码的简单记录,可能对于老手程序员营养价值不高,望莫见怪。
我工作上有个需求:从某处API接口上获取数据(大约1W条而已)并插入到数据库中。
楼主刚毕业菜鸟,没做过批量插入操作。借助baidu搜索得知SqlBulkCopy可以实现。SqlBulkCopy相关的原理,我现在还没了解就不摆弄了,以后补上!
(不要问为什么不用google,公司内网就连msdn.microsoft.com都不给上!另外我公司是开发C#/.NET的,不是JAVA。 )
首先,要从接口获取数据自然少不了发送请求,将XML格式的数据放入内存表DataTable中。
#region 发送HTTP获取数据 /// <summary> /// 发送HTTP获取数据 /// </summary> /// <param name="url">接口地址</param> /// <param name="method">接口方法</param> /// <returns></returns> public DataTable GetDataAsTabel(string url, string method) { DataSet ds = new System.Data.DataSet(); try { HttpWebRequest request = HttpWebRequest.Create(url + method) as HttpWebRequest; request.Method = "GET"; WebResponse response = request.GetResponse(); Stream stream = response.GetResponseStream(); string str = ""; using (StreamReader sr = new StreamReader(stream)) { str = sr.ReadToEnd(); } str.Trim(); ds.ReadXml(new StringReader(str), System.Data.XmlReadMode.Auto); ]; } catch (Exception ex) { MessageBox.Show("GetDataAsTabel方法出错:" + ex.Message); return null; } } #endregion
其次,使用SqlBulkCopy类把数据放数据库。SqlBulkCopy.WriteToServer()提供了4种重载方式,如下:
public void WriteToServer(DataRow[] rows);
public void WriteToServer(DataTable table);
public void WriteToServer(IDataReader reader);
public void WriteToServer(DataTable table, DataRowState rowState);
显然第二种最简单粗暴,大家都喜欢的。也就是上面的代码为什么要返回DataTable了。在新建SqlBulkCopy实例时,可以由SqlBulkCopyOptions来设置插入时的检查约束、锁表、触发器、每批次事务等操作。sqlBC.DestinationTableName是DB中要插入数据的表名。sqlBC.BatchSize是每一批次放入数据库的数据量。
默认情况下,SqlBulkCopy会认为源数据DataTable的列与目标表的列是一一对应的,一旦两者有所不同(列数或列名不一致)则会插入失败并报错。所以,我们需要用public SqlBulkCopyColumnMapping Add(string sourceColumn, string destinationColumn)来添加源列名与目标列名的对应关系。数据格式不用做匹配,SqlBulkCopy会帮忙转换。当然,用非时间格式的string转换成DateTime这种情况毫无疑问的报错。最后,qlBC.WriteToServer()收工。
#region 把数据写入数据库 /// <summary> /// 把数据写入数据库 /// </summary> /// <param name="tableName">数据库表名</param> /// <param name="dt">数据</param> /// <returns></returns> public bool WriteToServer(string tableName,DataTable dt) { bool execResult = false; SqlConnection sqlCon = new SqlConnection(SqlConnectionString); sqlCon.Open(); SqlTransaction sqlTran = sqlCon.BeginTransaction(); // 开始事务 SqlBulkCopy sqlBC = new SqlBulkCopy(sqlCon, SqlBulkCopyOptions.Default, sqlTran); sqlBC.DestinationTableName = tableName; sqlBC.BatchSize = ; ; i < dt.Columns.Count; i++) { sqlBC.ColumnMappings.Add(dt.Columns[i].ColumnName,dt.Columns[i].ColumnName); } try { sqlBC.WriteToServer(dt); sqlTran.Commit(); execResult = true; } catch (Exception ex) { execResult = false; sqlTran.Rollback(); MessageBox.Show("数据库错误:" + ex.Message); } finally { sqlBC.Close(); sqlCon.Close(); } return execResult; } #endregion
相关文章:http://www.cnblogs.com/zfanlong1314/archive/2013/02/05/2892998.html
既是推荐也是我自己的mark。
最新文章
- CodeForces #368 div2 D Persistent Bookcase DFS
- DB2死锁的解决办法
- java反射详解(转)
- scala中的trait
- 使用jQuery开发iOS风格的页面导航菜单
- SELECT INTO 和 INSERT INTO SELECT 两种表复制语句.txt
- [转]给C++初学者的50个忠告
- RabbitMQ安装和配置
- python针对于mysql的增删改查
- swift 用协议实现代理传值功能
- tornado的非异步阻塞模式
- 使用ajax调用webservice加载table
- Laravel (5.5.33) 加载过程(一)
- Java ORM Hibernate 入门笔记
- web 后台返回json格式数据的方式(status 406)
- 05 python 初学(列表)
- 目标检测之faster-RCNN和FPN
- Tomcat增加虚拟内存(转)
- CentOS 下运行Docker 内执行 docker build 命令的简单方法
- 独立开发人员低成本推广APP的18条技巧
热门文章
- LoadRunner显示中文乱码的问题
- jQuery jsonp跨域请求
- baseadapter.getItemId的使用方法:实现listview筛选、动态删除
- cocos2d-x CCScale9Sprite
- 参数对象Struts2中Action的属性接收参数
- .net抓取网页信息 - Jumony框架使用1
- Cocos2D Study - Preparation &; Installation
- Educational Codeforces Round 1 A. Tricky Sum 暴力
- 怎样在osg中动态的设置drawable的最近最远裁剪面
- CSAPP缓冲区溢出攻击实验(上)