C 幾種資料庫的大資料批量插入

2021-06-22 15:00:33 字數 4696 閱讀 3229

每天都是不一樣,積極的去感受生活

在之前只知道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...