小弟新手程序员一枚,代码技术和文章水平均不才。所写文章均为对自己所写所学代码的简单记录,可能对于老手程序员营养价值不高,望莫见怪。

  

  我工作上有个需求:从某处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的更多相关文章

  1. 使用Vue.js和Axios从第三方API获取数据 — SitePoint

    更多的往往不是,建立你的JavaScript应用程序时,你会想把数据从远程源或消耗一个[ API ](https:/ /恩.维基百科.org /维基/ application_programming_ ...

  2. 百度地图API获取数据

    目前,大厂的服务范围越来越广,提供的数据信息也是比较全的,在生活服务,办公领域,人工智能等方面都全面覆盖,相对来说,他们的用户基数大,通过用户获取的信息也是巨大的.除了百度提供api,国内提供免费AP ...

  3. 使用api获取数据————小程序

    使用api获取数据----小程序 onLoad: function (options) { //打开页面即执行. let that = this; wx.request({ //建立链接 url: ' ...

  4. C# WPF从RIOT API获取数据(RIOT代表作品《英雄联盟》)

    微信公众号:Dotnet9,网站:Dotnet9,问题或建议:请网站留言, 如果对您有所帮助:欢迎赞赏. C# WPF从RIOT API获取数据(RIOT代表作品<英雄联盟>) 阅读导航 ...

  5. SqlBulkCopy将DataTable中的数据批量插入数据库中

    #region 使用SqlBulkCopy将DataTable中的数据批量插入数据库中 /// <summary> /// 注意:DataTable中的列需要与数据库表中的列完全一致.// ...

  6. list转datatable,SqlBulkCopy将DataTable中的数据批量插入数据库

    /// <summary> /// 将泛类型集合List类转换成DataTable /// </summary> /// <param name="list&q ...

  7. HttpWebRequest 模拟网站登录获取数据

    此文档仅仅是一个BaseCode,已做后续查阅 项目使用IBM Platform Symphony分布式平台,所有业务处理都在这个分布式平台上计算,需求是获取这些计算机机群的运行状态,和每一个服务的的 ...

  8. [小干货]SqlBulkCopy简单封装,让批量插入更方便

    关于 SqlServer 批量插入的方式,前段时间也有大神给出了好几种批量插入的方式及对比测试(http://www.cnblogs.com/jiekzou/p/6145550.html),估计大家也 ...

  9. SqlBulkCopy简单封装,让批量插入更方便

    关于 SqlServer 批量插入的方式,前段时间也有大神给出了好几种批量插入的方式及对比测试(http://www.cnblogs.com/jiekzou/p/6145550.html),估计大家也 ...

随机推荐

  1. Spring Auto proxy creator example

    In last Spring AOP examples – advice, pointcut and advisor, you have to manually create a proxy bean ...

  2. Spring EL regular expression example

    Spring EL supports regular expression using a simple keyword "matches", which is really aw ...

  3. win8图片默认不显示

    最近,发现了一个问题,在查看图片的时候,出现了这样的情况: 查看的时候很不方便,想要找到自己需要的图片就要误打误撞,也不知道自己在哪儿设置了,于是,上网查资料,才发现其实只需要简单的该一下设置就可以了 ...

  4. ElasticSearch+Springboot实际应用:索引同步建设,搜索过程

    1.介绍 springboot框架,众多自动化的部署和约定配置,造成了springboot的着手麻烦,熟练后可以快速快捷进行开发,常用作快捷开发的java底层框架.各位看官都是大神,自行体会.     ...

  5. 用Emacs 写python了

    之前都是用python 自带的IDLE 写 python 的,现在换了Emacs,感觉真是不错,爽. 截图留念: 用了sr-speedbar ,顿时有了IDE 的感觉,是不是很爽. 版权声明:本文为博 ...

  6. EcShop之路-Smarty

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html 内部邀请码:C8E245J (不写邀请码,没有现金送) 国 ...

  7. 【不积跬步,无以致千里】VIM查找替换归纳总结zz

    http://spaces.msn.com/dingy/blog/cns!2F24B9E66A542581!327.entry VIM中常用的替换模式总结. 1,简单替换表达式 替换命令可以在全文中用 ...

  8. 添加MIME类型

    #查看站点test01下所有的MIME类型: Get-WebConfiguration -PSPath MACHINE/WEBROOT/APPHOST/test01 -Filter system.we ...

  9. 80端口被NT kernel & System 占用pid 4

    前段时间停止了Apache,结果在打开的时候发现无法打开,80端口被占用,于是win+r 运行cmd 输入netstat -ano 可以看到80端口被PID4占用,于是打开任务管理器-进程-查看,选择 ...

  10. Codeforces Round #327 (Div. 2) C. Median Smoothing 找规律

    C. Median Smoothing Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/591/p ...