C#從文本文件中讀取數據大批量導入數據庫


表結構:

文本文件太大就不上傳了。內容格式如下:

"號段" "所屬地區" "號碼類型" "區號"
1300000 "北京市" "聯通" "010"
1300001 "江蘇省常州市" "聯通" "0519"
1300002 "安徽省巢湖市" "聯通" "0565"
1300006 "江蘇省南京市" "聯通" "025"
1300008 "湖北省武漢市" "聯通" "027"

使用兩種方法實現插入:

一、Insert方法:

代碼如下:

//定義數據連接字符串
        private string connStr = ConfigurationManager.ConnectionStrings["connstr"].ConnectionString;

        /// <summary>
        /// 用insert方法從文本文件中批量導入到數據庫表中
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnInsert_Click(object sender, RoutedEventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = "文本文檔|*.txt";
            //如果用戶沒有選擇文件並確定則直接返回
            if (ofd.ShowDialog() != true)
            {
                return;
            }
            //獲得文件名包括路徑
            string fileName = ofd.FileName;

            try
            {
                //定義一個開始時間
                DateTime startTime = DateTime.Now;
                //因為文件比較大,所有使用StreamReader的效率要比使用File.ReadLines高
                using (StreamReader sr = new StreamReader(fileName, Encoding.Default))
                {
                    using (SqlConnection conn = new SqlConnection(connStr))
                    {
                        conn.Open();
                        using (SqlCommand cmd = conn.CreateCommand())
                        {
                            while (!sr.EndOfStream)
                            {
                                
                                string readStr = sr.ReadLine();//讀取一行數據
                                if (readStr.StartsWith("1"))//去掉標題行
                                {
                                    string[] strs = readStr.Split(new char[] { '\t', '"' }, StringSplitOptions.RemoveEmptyEntries);//將讀取的字符串按"制表符/t“和””“分割成數組

                                    string startNum = strs[0];
                                    string numArea = strs[1];
                                    string numType = strs[2];

                                    cmd.CommandText = "insert into T_PhoneInfo(FStartNum,FNumArea,FNumType) values(@startNum,@numArea,@numType)";
                                    cmd.Parameters.Clear();//清除上一次的參數
                                    cmd.Parameters.Add(new SqlParameter("@startNum", startNum));
                                    cmd.Parameters.Add(new SqlParameter("@numArea", numArea));
                                    cmd.Parameters.Add(new SqlParameter("@numType", numType));
                                    cmd.ExecuteNonQuery();
                                }
                            }
                        }
                    }

                }

                //結束時間-開始時間=總共花費的時間
                TimeSpan ts = DateTime.Now - startTime;
                MessageBox.Show("導入數據成功!共花費時間:" + ts.ToString());

            }
            catch (IOException ex)
            {
                MessageBox.Show(ex.Message);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

 此方法經過測試共花費時間:大約25分鍾。效率太低。

二、使用sqlBulkCopy方法:

代碼如下:

private void btnSqlBulkCopy_Click(object sender, RoutedEventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = "文本文檔|*.txt";
            //如果用戶沒有選擇文件並確定則直接返回
            if (ofd.ShowDialog() != true)
            {
                return;
            }
            //獲得文件名包括路徑
            string fileName = ofd.FileName;

            try
            {
                //定義一個開始時間
                DateTime startTime = DateTime.Now;
                
                //創建內存臨時數據表來存儲從文本文件中讀取出來的數據
                using (DataTable table = new DataTable())
                {
                    //為數據表創建相對應的數據列
                    table.Columns.Add("startNum");
                    table.Columns.Add("numArea");
                    table.Columns.Add("numType");

                    //因為文件比較大,所有使用StreamReader的效率要比使用File.ReadLines高
                    using (StreamReader sr = new StreamReader(fileName, Encoding.Default))
                    {
                        while (!sr.EndOfStream)
                        {
                            DataRow dr = table.NewRow();//創建數據行

                            string readStr = sr.ReadLine();//讀取一行數據
                            if (readStr.StartsWith("1"))//去掉標題行
                            {
                                string[] strs = readStr.Split(new char[] { '\t', '"' }, StringSplitOptions.RemoveEmptyEntries);//將讀取的字符串按"制表符/t“和””“分割成數組

                                string startNum = strs[0];
                                string numArea = strs[1];
                                string numType = strs[2];

                                //往對應的 行中添加數據
                                dr["startNum"] = startNum;
                                dr["numArea"] = numArea;
                                dr["numType"] = numType;

                                table.Rows.Add(dr);//將創建的數據行添加到table中
                            }
                        }
                    }

                    SqlBulkCopy bulkCopy = new SqlBulkCopy(connStr);

                    bulkCopy.DestinationTableName = "T_PhoneInfo";//設置數據庫中對象的表名

                    //設置數據表table和數據庫中表的列對應關系
                    bulkCopy.ColumnMappings.Add("startNum", "FStartNum");
                    bulkCopy.ColumnMappings.Add("numArea", "FNumArea");
                    bulkCopy.ColumnMappings.Add("numType", "FNumType");
                    bulkCopy.WriteToServer(table);//將數據表table復制到數據庫中

                    TimeSpan ts = DateTime.Now - startTime;
                    MessageBox.Show("共導入" +table.Rows.Count+ "條數據,總共花費時間:" + ts.ToString());
                }
                
            }
            catch (IOException ex)
            {
                MessageBox.Show(ex.Message);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

        }

 此方法共花費時間

差距啊,SqlBulkCopy在批量數據導入的時候效率好高。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM