若是要大量導入數據到數據庫,若是每條數據都要和數據庫創建-斷開鏈接,那麼將會很是費時。 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