你的位置:首页 > ASP.net教程

[ASP.net教程]C#/.NET使用HttpWebRequest、SqlBulkCopy从API获取数据批量插入DB


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

  

  我工作上有个需求:从某处API接口上获取数据(大约1W条而已)并插入到数据库中。

  楼主刚毕业菜鸟,没做过批量插入操作。借助baidu搜索得知SqlBulkCopy可以实现。SqlBulkCopy相关的原理,我现在还没了解就不摆弄了,以后补上!

  (不要问为什么不用google,公司内网就连msdn.microsoft.com都不给上!另外我公司是开发C#/.NET的,不是JAVA。 )

  

  首先,要从接口获取数据自然少不了发送请求,将

  

     #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.Readnew StringReader(str), System.Data.return ds.Tables[0];      }      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 = 10000;      for (int i = 0; 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。