最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#批量插入數(shù)據(jù)到sqlserver的方法詳解

 更新時間:2025年02月21日 08:58:13   作者:嘿嘿潶黑黑  
這篇文章主要為大家詳細介紹了C#中四種可以批量插入數(shù)據(jù)到sqlserver的方法,文中的示例代碼講解詳細,感興趣的小伙伴可以參考一下

方法一:逐條插入,性能最差,不推薦使用

INSERT INTO Test(Id, Name) VALUES(newid(), '1');
INSERT INTO Test(Id, Name) VALUES(newid(), '2');

C#方法

static void InsertOne()
{
    Console.WriteLine("采用一條一條插入的方式實現(xiàn)");
    Stopwatch sw = new Stopwatch();

    using (SqlConnection conn = new SqlConnection(StrConnMsg)) //using中會自動Open和Close 連接。
    {
        string sql = "INSERT INTO Test(Id,Name) VALUES(newid(),@p)";
                conn.Open();
        for (int i = 0; i < totalRow; i++)
        {
            using (SqlCommand cmd = new SqlCommand(sql, conn))
            {
                cmd.Parameters.AddWithValue("@p", i);
                sw.Start();
                cmd.ExecuteNonQuery();
                Console.WriteLine(string.Format("插入一條記錄,已耗時{0}毫秒", sw.ElapsedMilliseconds));
            }
            if (i == getRow)
            {
                sw.Stop();
                break;
            }
        }
    }
    Console.WriteLine(string.Format("插入{0}條記錄,每{4}條的插入時間是{1}毫秒,預估總得插入時間是{2}毫秒,{3}分鐘", totalRow, sw.ElapsedMilliseconds, ((sw.ElapsedMilliseconds / getRow) * totalRow), GetMinute((sw.ElapsedMilliseconds / getRow * totalRow)), getRow));
}

static int GetMinute(long l)
{
    return (Int32)l / 60000;
} 

結(jié)論

插入100w條記錄,預計需要50分鐘時間,每插入一條記錄大概需要3毫秒左右。

方法二:拼接sql

INSERT INTO Test(Id, Name) VALUES(newid(), '1'),(newid(), '2')

C#方法

static void InsertFour()
{
    Console.WriteLine("采用拼接批量SQL插入的方式實現(xiàn)");
    Stopwatch sw = new Stopwatch();

    using (SqlConnection conn = new SqlConnection(StrConnMsg)) //using中會自動Open和Close 連接。
    {
        conn.Open();
        sw.Start();
        for (int j = 0; j < totalRow / getRow;j++ )
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("INSERT INTO Product(Id,Name,Price) VALUES");
            using (SqlCommand cmd = new SqlCommand())
            {
                       
                for (int i = 0; i < getRow; i++)
                {
                    sb.AppendFormat("(newid(),'{0}'),", i);
                }
                cmd.Connection = conn;
                cmd.CommandText = sb.ToString().TrimEnd(',');
                cmd.ExecuteNonQuery();
            }
        }
        sw.Stop();
        Console.WriteLine(string.Format("插入{0}條記錄,共耗時{1}毫秒",totalRow,sw.ElapsedMilliseconds));
    }
}

結(jié)論

插入100w條記錄,預計需要10分鐘時間

方法三:使用Bulk

BULK INSERT    
   [ database_name . [ schema_name ] . | schema_name . ] [ table_name | view_name ] 
      FROM 'data_file'    
     [ WITH    
        (    
   [ [ , ] BATCHSIZE = batch_size ]    --BATCHSIZE指令來設置在單個事務中可以插入到表中的記錄的數(shù)量   
   [ [ , ] CHECK_CONSTRAINTS ]     --指定在大容量導入操作期間,必須檢查所有對目標表或視圖的約束。若沒有 CHECK_CONSTRAINTS 選項,則所有 CHECK 和 FOREIGN KEY 約束都將被忽略,并且在此操作之后表的約束將標記為不可信。   
   [ [ , ] CODEPAGE = { 'ACP' | 'OEM' | 'RAW' | 'code_page' } ]  --指定該數(shù)據(jù)文件中數(shù)據(jù)的代碼頁   
   [ [ , ] DATAFILETYPE =    
      { 'char' | 'native'| 'widechar' | 'widenative' } ]  --指定 BULK INSERT 使用指定的數(shù)據(jù)文件類型值執(zhí)行導入操作。   
   [ [ , ] FIELDTERMINATOR = 'field_terminator' ]  --標識分隔內(nèi)容的符號   
   [ [ , ] FIRSTROW = first_row ]    --指定要加載的第一行的行號。默認值是指定數(shù)據(jù)文件中的第一行   
   [ [ , ] FIRE_TRIGGERS ]     --是否啟動觸發(fā)器   
   [ [ , ] FORMATFILE = 'format_file_path' ]    
   [ [ , ] KEEPIDENTITY ]   --指定導入數(shù)據(jù)文件中的標識值用于標識列   
   [ [ , ] KEEPNULLS ]    --指定在大容量導入操作期間空列應保留一個空值,而不插入用于列的任何默認值   
   [ [ , ] KILOBYTES_PER_BATCH = kilobytes_per_batch ]    
   [ [ , ] LASTROW = last_row ]   --指定要加載的最后一行的行號   
   [ [ , ] MAXERRORS = max_errors ]   --指定允許在數(shù)據(jù)中出現(xiàn)的最多語法錯誤數(shù),超過該數(shù)量后將取消大容量導入操作。   
   [ [ , ] ORDER ( { column [ ASC | DESC ] } [ ,...n ] ) ]  --指定數(shù)據(jù)文件中的數(shù)據(jù)如何排序   
   [ [ , ] ROWS_PER_BATCH = rows_per_batch ]    
   [ [ , ] ROWTERMINATOR = 'row_terminator' ]   --標識分隔行的符號   
   [ [ , ] TABLOCK ]     --指定為大容量導入操作持續(xù)時間獲取一個表級鎖   
   [ [ , ] ERRORFILE = 'file_name' ]   --指定用于收集格式有誤且不能轉(zhuǎn)換為 OLE DB 行集的行的文件。   
        )]

C#方法

static void InsertTwo()
{
    Console.WriteLine("使用Bulk插入的實現(xiàn)方式");
    Stopwatch sw = new Stopwatch();
    DataTable dt = GetTableSchema(); 

    using (SqlConnection conn = new SqlConnection(StrConnMsg))
    {
        SqlBulkCopy bulkCopy = new SqlBulkCopy(conn);
        bulkCopy.DestinationTableName = "Product";
        bulkCopy.BatchSize = dt.Rows.Count;
        conn.Open();
        sw.Start();
        
        for (int i = 0; i < totalRow;i++ )
        {
            DataRow dr = dt.NewRow();
            dr[0] = Guid.NewGuid();
            dr[1] = string.Format("商品", i);
            dr[2] = (decimal)i;
            dt.Rows.Add(dr);
        }
        if (dt != null && dt.Rows.Count != 0)
        {
            bulkCopy.WriteToServer(dt);
            sw.Stop();
        }
        Console.WriteLine(string.Format("插入{0}條記錄共花費{1}毫秒,{2}分鐘", totalRow, sw.ElapsedMilliseconds, GetMinute(sw.ElapsedMilliseconds)));
    }
}

static DataTable GetTableSchema()
{
    DataTable dt = new DataTable();
    dt.Columns.AddRange(new DataColumn[] {   
        new DataColumn("Id",typeof(Guid)),  
        new DataColumn("Name",typeof(string))
    });
    return dt;
}

結(jié)論

插入100w條記錄,預計需要8s多

方法四:使用TVPs插入數(shù)據(jù)

創(chuàng)建緩存表

--Create Table Valued  
CREATE TYPE TestTemp AS TABLE  
  (Id int,  
   Name nvarchar(32))

c#方法

static void TbaleValuedToDB(DataTable dt)
{
    Stopwatch sw = new Stopwatch();
    SqlConnection sqlconn = new SqlConnection("server=.;database=TestDB;user=sa;password=123456;");
    const string TSqlStatement =
        "insert into Test (Id,Name)" +
        " SELECT tt.Id, tt.Name" +
        " FROM @TestTvp AS tt";
    SqlCommand cmd = new SqlCommand(TSqlStatement, sqlconn);
    SqlParameter catParam = cmd.Parameters.AddWithValue("@TestTvp", dt);
    catParam.SqlDbType = SqlDbType.Structured;
    catParam.TypeName = "dbo.TestTemp";
    try
    {
        sqlconn.Open();
        if (dt != null && dt.Rows.Count != 0)
        {
            cmd.ExecuteNonQuery();
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine("error>" + ex.Message);
    }
    finally
    {
        sqlconn.Close();
    }
}

static void TVPsInsert()
{
    Console.WriteLine("使用簡稱TVPs插入數(shù)據(jù)");
    Stopwatch sw = new Stopwatch();
    for (int i = 0; i < 10; i++)
    {
        DataTable dt = GetTableSchema();
        for (int j = i * 100; j < (i + 1) * 100; j++)
        {
            DataRow r = dt.NewRow();
            r[0] = j;
            r[1] = string.Format("{0}", i * j);
            dt.Rows.Add(r);
        }
        sw.Start();
        TbaleValuedToDB(dt);
        sw.Stop();
        Console.WriteLine(string.Format("Elapsed Time is {0} Milliseconds", sw.ElapsedMilliseconds));
    }
    Console.ReadLine();  
}

結(jié)論

插入100w條記錄,預計需要11s多

以上就是C#批量插入數(shù)據(jù)到sqlserver的方法詳解的詳細內(nèi)容,更多關于C#插入數(shù)據(jù)到sqlserver的資料請關注腳本之家其它相關文章!

相關文章

  • C#編程總結(jié)(一)序列化總結(jié)

    C#編程總結(jié)(一)序列化總結(jié)

    本篇主要介紹了C#序列化總結(jié),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • 詳解如何利用C#實現(xiàn)設置系統(tǒng)時間

    詳解如何利用C#實現(xiàn)設置系統(tǒng)時間

    這篇文章主要為大家詳細介紹了如何利用C#實現(xiàn)設置系統(tǒng)時間功能,文中的示例代碼講解詳細,對我們學習C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下
    2022-12-12
  • 利用C#版OpenCV實現(xiàn)圓心求取實例代碼

    利用C#版OpenCV實現(xiàn)圓心求取實例代碼

    這篇文章主要給大家介紹了關于如何利用C#版OpenCV實現(xiàn)圓心求取的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-05-05
  • C# 實現(xiàn)ADSL自動斷網(wǎng)和撥號的方法(適用于撥號用戶)

    C# 實現(xiàn)ADSL自動斷網(wǎng)和撥號的方法(適用于撥號用戶)

    下面小編就為大家?guī)硪黄狢# 實現(xiàn)ADSL自動斷網(wǎng)和撥號的方法(適用于撥號用戶)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • C#七大經(jīng)典排序算法系列(下)

    C#七大經(jīng)典排序算法系列(下)

    這篇文章主要為大家詳細介紹了C#七大經(jīng)典排序算法系列下篇,直接插入排序,希爾排序和歸并排序,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • 詳解C#中的接口屬性以及屬性訪問器的訪問限制

    詳解C#中的接口屬性以及屬性訪問器的訪問限制

    這篇文章主要介紹了詳解C#中的接口屬性以及屬性訪問器的訪問限制,文中講到了使用訪問器實現(xiàn)接口時添加訪問修飾符的問題,需要的朋友可以參考下
    2016-01-01
  • C# 獲取某個時間的0點0分和23點59分59秒

    C# 獲取某個時間的0點0分和23點59分59秒

    這篇文章主要介紹了C# 獲取某個時間的0點0分和23點59分59秒,文中給大家提到了java 獲取某一日期的0點0分0秒和23點59分59秒,需要的朋友可以參考下
    2019-09-09
  • Unity報錯InvalidOperationException: out of sync的解決

    Unity報錯InvalidOperationException: out of sync的解決

    今天在做個東西,發(fā)現(xiàn)報錯,特此來記錄一下,本文介紹了Unity報錯InvalidOperationException: out of sync的解決,感興趣的可以了解一下
    2021-05-05
  • 詳解C# parallel中并行計算的四種寫法總結(jié)

    詳解C# parallel中并行計算的四種寫法總結(jié)

    在C#中,parallel關鍵字可以用于并行計算。本文為大家總結(jié)了四種C# parallel并行計算的方法,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2022-11-11
  • C#有效防止同一賬號多次登錄(附三種方法)

    C#有效防止同一賬號多次登錄(附三種方法)

    這篇文章主要介紹了C#有效防止同一賬號多次登錄的方法,有效防止同一賬號多次登錄的方法很多,比如用數(shù)據(jù)庫來記錄用戶登錄情況、用Application來保存用戶登錄信息、用Cache來保存信息等,感興趣的小伙伴們可以參考一下
    2015-11-11

最新評論

安阳市| 邯郸县| 平邑县| 苏尼特右旗| 浦江县| 新密市| 呈贡县| 安化县| 富宁县| 孝感市| 宣城市| 清水河县| 永定县| 敖汉旗| 桑日县| 资溪县| 阿拉善右旗| 泰和县| 洮南市| 平凉市| 雷州市| 东光县| 郎溪县| 新乡市| 隆林| 靖西县| 集贤县| 建德市| 弥勒县| 泸西县| 麻阳| 社旗县| 岳池县| 杂多县| 灵宝市| 揭东县| 伊通| 偏关县| 斗六市| 盐城市| 平阴县|