C#使用表參數和存儲過程批量導入數據

若是要大量導入數據到數據庫,若是每條數據都要和數據庫創建-斷開鏈接,那麼將會很是費時。 sql

個性化的方法:就是使用表參數和存儲過程,特色是很是自由靈活,能夠在存儲過程當中實現所須要的SQL操做。 數據庫

下面這個方法生產一個Datatable c#

public void InsertUserAndMacByDt(string[] alarmDataArry, int ME60ID)
{

    try
    {
        int Count = alarmDataArry.Length;
        string sqlCmd = string.Empty;
        string PPOE_USERNAME = string.Empty;
        string USERMAC = string.Empty;
        DbMan mydb = new DbMan(sqlConstr);
        if (Count >= 0)
        {
            System.Data.DataTable dt = new DataTable("userAndMac");
            dt.Columns.Add("ME60ID", typeof(int));
            dt.Columns.Add("USERNAME", typeof(string));
            dt.Columns.Add("USERMAC", typeof(string));
            dt.Columns.Add("INSERTDATE", typeof(DateTime));
            dt.Columns.Add("UPDATETIME", typeof(DateTime));
           for (int i =0; i <Count; i++)
           {
               
                dt.Rows.Add(ME60ID, alarmDataArry[i].Split(',')[0], alarmDataArry[i].Split(',')[1], DateTime.Now.ToString(), DateTime.Now.ToString());      
           }
           mydb.insertTableToDB(dt);
          
        }
        mydb.Close();

    }
    catch (Exception ex)
    {
        saveErrorToFile(errorPath, DateTime.Now.ToString() + ex.Message + "\r\n");
        //errorPath 存放程序運行錯誤信息
    }
}

下面這個方法執行數據庫操做 性能

//這只是類的一部分,插入數據庫的方法。 
 public void InsertTableToDB(System.Data.DataTable dt)
        {
          
                sqlCon.Open();
                //// Invokes the stored procedure.
                using (var cmd = new SqlCommand("csp_insert_user_and_mac_by_table", sqlCon))
                {
                    cmd.CommandType = CommandType.StoredProcedure;

                    //// Adding a "structured" parameter allows you to insert tons of data with low overhead
                    var param = new SqlParameter("@userTable", SqlDbType.Structured) { Value = dt };
                    cmd.Parameters.Add(param);
                    cmd.ExecuteNonQuery();              
                }
                sqlCon.Close();
        
        }

每次插入數據量不大,就1萬條左右,都是秒殺的。 code

另一個方法SqlBulkCopy適用於不作任何處理,批量插入原始數據。 cmd

如下部分代碼來自CSDN論壇。 string

原來有個類以前從沒有用過(也不怪,歷來沒有遇到過一會兒插入600W條記錄的性能問題),這就是神通常的SqlBulkCopy~~~ it

代碼:

  SqlBulkCopy sqlBC = new SqlBulkCopy(connectionString, SqlBulkCopyOptions.UseInternalTransaction);
            sqlBC.DestinationTableName = "CSDN_Users";
            DataTable dt = new DataTable("CSDN_Users");
            dt.Columns.Add("ID", typeof(int));
            dt.Columns.Add("UserName", typeof(string));
            dt.Columns.Add("PassWord", typeof(string));
            dt.Columns.Add("Email", typeof(string));
            StreamReader sr = new StreamReader(@"D:\CSDN.txt");
            string[] userInfo;
            string readStr;
            int flag = 0;
            while (sr.Peek() > -1)
            {
                flag++;
                readStr = sr.ReadLine();
                userInfo = readStr.Split('#');
                dt.Rows.Add(0, userInfo[0], userInfo[1], userInfo[2]);
                if (flag % 100000 == 0)
                {
                    sqlBC.WriteToServer(dt);
                    dt.Clear();
                }
            }
            sqlBC.WriteToServer(dt);
            dt.Dispose();
            sqlBC.Close();
            sr.Close(); io

考慮到時間跟空間的問題,以爲每次讀10W條恰到好處,執行,完美,原本估計要七八個小時才能寫入的1分鐘就所有寫入到數據庫。 table

相關文章
相關標籤/搜索