在開發中遇到了一張表的資料因為只做了同步插入而沒有做同步更新的操作,導致了百萬資料不準確。面對大量資料需要更新,傳統的迴圈逐條插入以及拼接1000條資料插入都比較耗時,網上有博主做出了相關測試。
根據以上場景,新建控制台程式。config新增資料庫連線配置,sqlhelper連線更新資料來源,sqlbulkcopyhelper連線更新目標庫。
建立sqlhelper類
usingsystem;
using
system.collections.generic;
using
system.data;
using
system.data.sqlclient;
using
system.linq;
using
system.text;
using
system.threading.tasks;
namespace
sqlbulkcopyhelper
public sqlhelper(string
connectionstr)
//////
得到連線物件
/// ///
public
static
sqlconnection getconn()
//////
查詢操作
/// ///
///public
static datatable getdatatable(string sql, params
sqlparameter sp)}}
//////
增刪改操作
/// ///
sql語句
///執行後的條數
public
static
int executenonquery(string sql, params
sqlparameter sp)}}
//////
執行一條sql語句,返回首行首列
/// ///
sql語句
///首行首列
public
static
object executescalar(string sql, params
sqlparameter sp)}}
}}
建立sqlbulkcopyhelper
//////sqlbulkcopy 批量更新資料
/// ///
資料集 ///
臨時表建立字段
///更新語句
public
static
void bulkupdatedata(datatable datatable, string cratetemplatesql, string
updatesql)
)", cratetemplatesql);
command.executenonquery();
//使用sqlbulkcopy 載入資料到臨時表中
using (var bulkcopy = new
sqlbulkcopy(conn))
bulkcopy.bulkcopytimeout = 660
; bulkcopy.destinationtablename = "
#tmptable";
bulkcopy.writetoserver(datatable);
bulkcopy.close();
}//執行command命令 使用臨時表的資料去更新目標表中的資料 然後刪除臨時表
command.commandtimeout = 300
; command.commandtext =updatesql;
command.executenonquery();
}finally}}
}
program**
//////更新表資料
/// public
static
void
update()
console.readline();
}
1.更新的時候,datatable資料量過大記憶體不夠用,這裡是分了一下頁。
2.還需要注意的就是sqlbulkcopy在使用的時候,檢視或者是源表的字段大小寫、型別必須與目標表一致。
3. merge,使用merger語句可以將插入、更新、刪除合併成一句,完成存在就更新不存在就插入的需求。
SQLBulkCopy使用 sql批量新增
sqlbulkcopy,用於資料庫之間大批量的資料傳遞。通常用於新,舊資料庫之間資料的更新。即使表結構完全不同,也可以通過欄位間的對應關係,順利的將資料導過來。首先,sqlbulkcopy需要2個連線。分別連線到不同的舊表所在的資料庫,新錶所在的資料庫。如果是同乙個資料庫,就可以用同乙個sqlcon...
使用 SqlBulkCopy 批量插入資料
使用sqlbulkcopy將datatable中的資料批量插入資料庫中 資料庫中對應的表名 資料集 中英文對應字典 public string sqlbulkcopyinsert string connstr,string strtablename,datatable dtdata,dictiona...
SqlBulkCopy 批量插入
批量插入資料 public static void bulkcopy string pconnectstring,datatable dt,string tablename,int pbatchsize 10000 console.writeline string.format 插入條記錄共花費毫秒...