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

  

  我工作上有个需求:从某处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。

 

最新文章

  1. CodeForces #368 div2 D Persistent Bookcase DFS
  2. DB2死锁的解决办法
  3. java反射详解(转)
  4. scala中的trait
  5. 使用jQuery开发iOS风格的页面导航菜单
  6. SELECT INTO 和 INSERT INTO SELECT 两种表复制语句.txt
  7. [转]给C++初学者的50个忠告
  8. RabbitMQ安装和配置
  9. python针对于mysql的增删改查
  10. swift 用协议实现代理传值功能
  11. tornado的非异步阻塞模式
  12. 使用ajax调用webservice加载table
  13. Laravel (5.5.33) 加载过程(一)
  14. Java ORM Hibernate 入门笔记
  15. web 后台返回json格式数据的方式(status 406)
  16. 05 python 初学(列表)
  17. 目标检测之faster-RCNN和FPN
  18. Tomcat增加虚拟内存(转)
  19. CentOS 下运行Docker 内执行 docker build 命令的简单方法
  20. 独立开发人员低成本推广APP的18条技巧

热门文章

  1. LoadRunner显示中文乱码的问题
  2. jQuery jsonp跨域请求
  3. baseadapter.getItemId的使用方法:实现listview筛选、动态删除
  4. cocos2d-x CCScale9Sprite
  5. 参数对象Struts2中Action的属性接收参数
  6. .net抓取网页信息 - Jumony框架使用1
  7. Cocos2D Study - Preparation &amp; Installation
  8. Educational Codeforces Round 1 A. Tricky Sum 暴力
  9. 怎样在osg中动态的设置drawable的最近最远裁剪面
  10. CSAPP缓冲区溢出攻击实验(上)