ADO.net--SqlBulkCopy批量插入數據

通常狀況下,咱們在向數據庫中插入數據時用Insert語句,可是當數據量很大的時候,這種狀況就比較緩慢了,這個時候就須要SqlBulkCopy這個類。web

SqlBulkCopy自己經常使用的函數有這麼幾個數據庫

DestinationTableName-----服務器目標表上的名稱,也就是你要向哪一個表插入大量的數據,這個就設置爲那個表名c#

ColumnMappings-----字段映射,由於是要在本地創建一個Table,而後將整個Table一次性的加入到數據庫中,所以須要將本地的Table的字段和數據庫表中的字段作好映射關係數組

WriteToServer-----這個就是寫入數據庫了,不須要多說服務器

導入的數據是傳智播客免費視頻上提供的手機號碼歸屬地的信息,插入數據庫看了一下,一共有258113條數據,用時大概6秒吧。app

private void btnDR_Click(object sender, RoutedEventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = "文本文件|*.txt";
            if(ofd.ShowDialog()!=true)
            {
                return;
            }
            DateTime time = DateTime.Now;//計時,看看花了多長時間
            
            DataTable table = new DataTable();//本地建立一個臨時表
            //給臨時表添加列名
            table.Columns.Add("HD");
            table.Columns.Add("DQ");
            table.Columns.Add("LX");
            using(StreamReader streamReader=new StreamReader(ofd.FileName,Encoding.Default))//讀取文件
            {
                while(!streamReader.EndOfStream)
                {
                    string[] stringStream = streamReader.ReadLine().Split('\t');//按行讀取,經過\t進行分割,獲得數組
                    string HD = stringStream[0].Trim('"');
                    string DQ = stringStream[1].Trim('"');
                    string LX = stringStream[2].Trim('"');
                    //將數據插入到本地建立的臨時表裏
                    DataRow row = table.NewRow();
                    row["HD"] = HD;
                    row["DQ"] = DQ;
                    row["LX"] = LX;
                    table.Rows.Add(row);
                }
            }
            //這部分就是從本地導入到數據庫中
            using(SqlConnection conn=new SqlConnection("Data Source=.;Initial Catalog=imageprocess;Integrated Security=True"))
            {
                conn.Open();
                using(SqlBulkCopy bulkCopy=new SqlBulkCopy(conn))
                {
                    bulkCopy.DestinationTableName = "T_HM";
                    bulkCopy.ColumnMappings.Add("HD", "HD");//前面的參數是本地的臨時Table列名,後面的參數是數據庫的列名。兩個名稱不須要相同,我寫相同,是爲了方便
                    bulkCopy.ColumnMappings.Add("DQ", "DQ");
                    bulkCopy.ColumnMappings.Add("LX", "LX");
                    bulkCopy.WriteToServer(table);
                }
            }
            TimeSpan TS = DateTime.Now - time;
            MessageBox.Show(TS.ToString());           
        }
相關文章
相關標籤/搜索