每天都是不一樣,積極的去感受生活
在之前只知道sqlserver支援資料批量插入,殊不知道oracle、sqlite和mysql也是支援的,不過oracle需要使用orace.dataaccess驅動,今天就貼出幾種資料庫的批量插入解決方法。
首先說一下,iprovider裡有乙個用於實現批量插入的外掛程式服務介面ibatcherprovider,此介面在前一篇文章中已經提到過了。
///
/// 提供資料批量處理的方法。
///
public inte***ce ibatcherprovider : iproviderservice
一、sqlserver資料批量插入
sqlserver的批量插入很簡單,使用sqlbulkcopy就可以,以下是該類的實現:
///
/// 為 system.data.sqlclient 提供的用於批量操作的方法。
///
public sealed class mssqlbatcher : ibatcherprovider
///
/// 將 的資料批量插入到資料庫中。
///
/// 要批量插入的 。
/// 每批次寫入的資料量。
以上沒有使用事務,使用事務在效能上會有一定的影響,如果要使用事務,可以設定sqlbulkcopyoptions.useinternaltransaction。
二、oracle資料批量插入
system.data.oracleclient不支援批量插入,因此只能使用oracle.dataaccess元件來作為提供者。
///
/// oracle.data.access 元件提供的用於批量操作的方法。
///
public sealed class oracleaccessbatcher : ibatcherprovider
///
/// 將 的資料批量插入到資料庫中。
///
/// 要批量插入的 。
/// 每批次寫入的資料量。
public void insert(datatable datatable, int batchsize = 10000)
using (var connection = servicecontext.database.createconnection())
command.connection = connection;
command.commandtext = generateinsersql(servicecontext.database, command, datatable);
command.executenonquery();}}
catch (exception exp)
finally}}
///
/// 生成插入資料的sql語句。
///
///
///
///
///
以上最重要的一步,就是將datatable轉為陣列的陣列表示,即object,前陣列的上標是列的個數,後陣列是行的個數,因此迴圈columns將後陣列作為parameter的值,也就是說,引數的值是乙個陣列。而insert語句與一般的插入語句沒有什麼不一樣。
三、sqlite資料批量插入
sqlite的批量插入只需開啟事務就可以了,這個具體的原理不得而知。
public sealed class sqlitebatcher : ibatcherprovider
///
/// 將 的資料批量插入到資料庫中。
///
/// 要批量插入的 。
/// 每批次寫入的資料量。
public void insert(datatable datatable, int batchsize = 10000)
using (var connection = servicecontext.database.createconnection())
command.connection = connection;
command.commandtext = generateinsersql(servicecontext.database, datatable);
if (command.commandtext == string.empty)
var flag = new assertflag();
datatable.eachrow(row =>);}
transcation.commit();
}catch (exception exp)
throw new batcherexception(exp);
}finally}}
private void processcommandparameters(datatable datatable, dbcommand command, datarow row, bool first)
else
parameter.value = row[c];}}
///
/// 生成插入資料的sql語句。
///
///
///
///
四、mysql資料批量插入
///
/// 為 mysql.data 元件提供的用於批量操作的方法。
///
public sealed class mysqlbatcher : ibatcherprovider
///
/// 將 的資料批量插入到資料庫中。
///
/// 要批量插入的 。
/// 每批次寫入的資料量。
public void insert(datatable datatable, int batchsize = 10000)
using (var connection = servicecontext.database.createconnection())
command.connection = connection;
command.commandtext = generateinsersql(servicecontext.database, command, datatable);
if (command.commandtext == string.empty)
command.executenonquery();}}
catch (exception exp)
finally}}
///
/// 生成插入資料的sql語句。
///
///
///
///
///
///
///
private bool isstringtype(dbtype dbtype)
///
/// 建立引數。
///
///
///
///
///
///
///
///
///
private dbparameter createparameter(iprovider provider, bool isstrtype, dbtype dbtype, object value, char parprefix, int row, int col)
p__", parprefix, row, col);
var parameter = provider.dbprovide***ctory.createparameter();
parameter.parametername = name;
parameter.direction = parameterdirection.input;
parameter.dbtype = dbtype;
parameter.value = value;
return parameter;
}return null;}}
mysql的批量插入,是將值全部寫在語句的values裡,例如,insert batcher(id, name) values(1, '1', 2, '2', 3, '3', ........ 10, '10')。
五、測試
接下來寫乙個測試用例來看一下使用批量插入的效果。
[test]
public void testbatchinsert()
//獲取 ibatcherprovider
var batcher = database.provider.getservice();
if (batcher == null)
else
//輸出batcher表的資料量
var sql = new sqlcommand("select count(1) from batcher");
console.writeline("當前共有 條資料", database.executescalar(sql));
})));
}以下表中列出了四種資料庫生成10萬條資料各耗用的時間
資料庫耗用時間
mssql
00:00:02.9376300
oracle
00:00:01.5155959
sqlite
00:00:01.6275634
mysql
00:00:05.4166891
資料庫程式設計 批量插入資料
1.編寫簡單的批量資料插入,可用在效能測試時多資料的壓力測試,檢測網頁,或客戶端介面資料量較多時是否有異常現象,在測試過程中經常需要使用到這種方式,學會這個,以後簡單的插入批量資料就可以自己完成啦,不用再依賴開發了,let s go 2.先檢視需要進行批量插入資料的表結構,例如,乙個 本表,表結構如...
幾種資料庫程式設計介面
從功能簡單的資料庫 如jet engine 到複雜的大型資料庫系統 如oracle vc 6.0都提供了一些程式設計介面。本文主要介紹以下五種 1.odbc api 2.mfc odbc類 3.mfc dao類 資料訪問物件 4.mfc的ole db 5.activex資料物件 ado 1.開放資料...
批量插入oracle資料庫
odp技術,引數可以為陣列 注意事項 1 時間處理 防止資料庫中有date型別的資料,不設定格式則會出現無效月份的情況,如 new oracledate 2011 08 26 17 18 19 oracleglobalization og oracleglobalization.getclienti...