C# .net 批量插入数据库的两种方法

13 篇文章 0 订阅

普通的insert 语句插入就不介绍了,着重说一下高效的批量插入大数据的方法

第一种方式: bulk方法主要是客户端把数据都缓存在Table中,然后利用SqlBulkCopy把Table中的数据插入到数据库


BulkTable  这是已经创建的表

public static void BulkToDB(DataTable dt)
{
    SqlConnection sqlConn = new SqlConnection(
        ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString);
    SqlBulkCopy bulkCopy = new SqlBulkCopy(sqlConn);
    bulkCopy.DestinationTableName = "BulkTable";
    bulkCopy.BatchSize = dt.Rows.Count;


    try
    {
        sqlConn.Open();
if (dt != null && dt.Rows.Count != 0)
    bulkCopy.WriteToServer(dt);
    }
    catch (Exception ex)
    {
        throw ex;
    }
    finally
    {
        sqlConn.Close();
        if (bulkCopy != null)
            bulkCopy.Close();
    }
}


public static DataTable GetTableSchema()
{
    DataTable dt = new DataTable();
    dt.Columns.AddRange(new DataColumn[]{
        new DataColumn("Id",typeof(int)),
        new DataColumn("Uname",typeof(string)),
new DataColumn("Upass",typeof(string))});


    return dt;
}


static void Main(string[] args)
{
    Stopwatch sw = new Stopwatch();
    for (int multiply = 0; multiply < 10; multiply++)
    {
        DataTable dt = Bulk.GetTableSchema();
        for (int count = multiply * 100000; count < (multiply + 1) * 100000; count++)
        {
            DataRow r = dt.NewRow();
            r[0] = count;
            r[1] = string.Format("U-{0}", count * multiply);
            r[2] = string.Format("P-{0}", count * multiply);
            dt.Rows.Add(r);
        }
        sw.Start();
        Bulk.BulkToDB(dt);
        sw.Stop();
        Console.WriteLine(string.Format("Elapsed Time is {0} Milliseconds", sw.ElapsedMilliseconds));
    }


    Console.ReadLine();
}




第二种方式

使用表值参数是SQL Server 2008新特性,简称TVPs。 这个是目前速度最快的一个,局限是需要在数据库创建一个”用户自定义表类型“。创建方式

:可编辑性-->类型-->用户自定义表类型

首先先 创建 用户自定义类型  BulkUdt(名字自定义)

public static void TableValuedToDB(DataTable dt)
{
    SqlConnection sqlConn = new SqlConnection(
      ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString);
    const string TSqlStatement =
     "insert into BulkTestTable (Id,UserName,Pwd)" +
     " SELECT nc.Id, nc.UserName,nc.Pwd" +
     " FROM @NewBulkTestTvp AS nc";
    SqlCommand cmd = new SqlCommand(TSqlStatement, sqlConn);
    SqlParameter catParam = cmd.Parameters.AddWithValue("@NewBulkTestTvp", dt);
    catParam.SqlDbType = SqlDbType.Structured;
    //表值参数的名字叫BulkUdt,在上面的建立测试环境的SQL中有。
    catParam.TypeName = "dbo.BulkUdt";
    try
    {
      sqlConn.Open();
      if (dt != null && dt.Rows.Count != 0)
      {
          cmd.ExecuteNonQuery();
      }
    }
    catch (Exception ex)
    {
      throw ex;
    }
    finally
    {
      sqlConn.Close();
    }
}


public static DataTable GetTableSchema()
{
    DataTable dt = new DataTable();
    dt.Columns.AddRange(new DataColumn[]{
      new DataColumn("Id",typeof(int)),
      new DataColumn("UserName",typeof(string)),
      new DataColumn("Pwd",typeof(string))});


    return dt;
}


static void Main(string[] args)
{
    Stopwatch sw = new Stopwatch();
    for (int multiply = 0; multiply < 10; multiply++)
    {
        DataTable dt = TableValued.GetTableSchema();
        for (int count = multiply * 100000; count < (multiply + 1) * 100000; count++)
        {        
            DataRow r = dt.NewRow();
            r[0] = count;
            r[1] = string.Format("User-{0}", count * multiply);
            r[2] = string.Format("Pwd-{0}", count * multiply);
            dt.Rows.Add(r);
        }
        sw.Start();
        TableValued.TableValuedToDB(dt);
        sw.Stop();
        Console.WriteLine(string.Format("Elapsed Time is {0} Milliseconds", sw.ElapsedMilliseconds));
    }


    Console.ReadLine();
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值