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。
C#/.NET使用HttpWebRequest、SqlBulkCopy从API获取数据批量插入DB的更多相关文章
- 使用Vue.js和Axios从第三方API获取数据 — SitePoint
更多的往往不是,建立你的JavaScript应用程序时,你会想把数据从远程源或消耗一个[ API ](https:/ /恩.维基百科.org /维基/ application_programming_ ...
- 百度地图API获取数据
目前,大厂的服务范围越来越广,提供的数据信息也是比较全的,在生活服务,办公领域,人工智能等方面都全面覆盖,相对来说,他们的用户基数大,通过用户获取的信息也是巨大的.除了百度提供api,国内提供免费AP ...
- 使用api获取数据————小程序
使用api获取数据----小程序 onLoad: function (options) { //打开页面即执行. let that = this; wx.request({ //建立链接 url: ' ...
- C# WPF从RIOT API获取数据(RIOT代表作品《英雄联盟》)
微信公众号:Dotnet9,网站:Dotnet9,问题或建议:请网站留言, 如果对您有所帮助:欢迎赞赏. C# WPF从RIOT API获取数据(RIOT代表作品<英雄联盟>) 阅读导航 ...
- SqlBulkCopy将DataTable中的数据批量插入数据库中
#region 使用SqlBulkCopy将DataTable中的数据批量插入数据库中 /// <summary> /// 注意:DataTable中的列需要与数据库表中的列完全一致.// ...
- list转datatable,SqlBulkCopy将DataTable中的数据批量插入数据库
/// <summary> /// 将泛类型集合List类转换成DataTable /// </summary> /// <param name="list&q ...
- HttpWebRequest 模拟网站登录获取数据
此文档仅仅是一个BaseCode,已做后续查阅 项目使用IBM Platform Symphony分布式平台,所有业务处理都在这个分布式平台上计算,需求是获取这些计算机机群的运行状态,和每一个服务的的 ...
- [小干货]SqlBulkCopy简单封装,让批量插入更方便
关于 SqlServer 批量插入的方式,前段时间也有大神给出了好几种批量插入的方式及对比测试(http://www.cnblogs.com/jiekzou/p/6145550.html),估计大家也 ...
- SqlBulkCopy简单封装,让批量插入更方便
关于 SqlServer 批量插入的方式,前段时间也有大神给出了好几种批量插入的方式及对比测试(http://www.cnblogs.com/jiekzou/p/6145550.html),估计大家也 ...
随机推荐
- 生成Base58格式的UUID(Hibernate Base64格式的UUID续)
Base58简介 Base58采用的字符集合为“123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ”,从这不难看出,Base58是纯数 ...
- C++中使用函数指针 【瓦特芯笔记】
在C++类中使用函数指针. 类型定义: typedef 返回类型(类名::*新类型)(参数表) //类定义 class CA { public: char lcFun(int a) ...
- POJ 3259 Wormholes(SPFA判负环)
题目链接:http://poj.org/problem?id=3259 题目大意是给你n个点,m条双向边,w条负权单向边.问你是否有负环(虫洞). 这个就是spfa判负环的模版题,中间的cnt数组就是 ...
- CodeForces 589A Email Aliases (匹配,水题)
题意:给定于所有的邮箱,都是由login@domain这样的形式构成,而且字符都是不区分大小写的. 我们有一种特殊类型的邮箱——@bmail.com, 这种邮箱除了不区分大小写外—— 1,'@'之前的 ...
- C++11新特性(3) lambda表达式(1)
C++11加入了一项名为lambda表达式的新功能.通过这项功能能编写内嵌的匿名函数,而不必编写独立函数或函数对象,使得代码更加理解. lambda表达式包括下面部分. [capture_block] ...
- 记录一下跟Python有关的几个拓展名
.py python文本源码文件,也可以用python.exe直接运行 .pyw 也是python的文本源码文件,但是默认由pythonw.exe打开,而且不显示命令行窗口,带GUI的python代码 ...
- iOS开发笔记系列-基础7(C语言特性)
Objective-C是C语言的扩展,因此,也具备很多C语言的基本特性,这里只罗列部分. 块(Blocks) 块是对C语言的一种扩展,它并未作为标准ANSI C所定义的部分,而是Apple添加到语言中 ...
- C# 使用xsd文件验证XML 格式是否正确
C# 使用xsd文件验证XML 格式是否正确 核心示例代码: //创建xmlDocument XmlDocument doc = new XmlDocument(); //创建声明段 如<?xm ...
- delphi 文件或目录转换成 TreeView
//文件或目录转换成 TreeViewprocedure DirToTreeView(Tree: TTreeView; Directory: string; Root: TTreeNode; Incl ...
- delphi Caption 垂直显示标签文本
//垂直显示标签文本 Label1.Caption:='垂'+#13+'直'+#13+'显'+#13+'示';//使用相同的方法,我们也可以制作垂直显示的提示(Hint):button1.Hint:= ...