SqlBulkCopy 是個好對象


SqlBulkCopy是專門用作大數據的導入的, 相比單條的Insert看起來要爽的多. 據說能相差幾十倍的性能差距(我們稍后自己做一下測試)

微軟關於SqlBulkCopy給出的信息如下

Microsoft SQL Server 提供一個稱為 bcp 的流行的命令提示符實用工具,用於將數據從一個表移動到另一個表(表既可以在同一個服務器上,也可以在不同服務器上)。SqlBulkCopy 類允許編寫提供類似功能的托管代碼解決方案。還有其他將數據加載到 SQL Server 表的方法(例如 INSERT 語句),但相比之下 SqlBulkCopy 提供明顯的性能優勢。 使用 SqlBulkCopy 類只能向 SQL Server 表寫入數據。但是,數據源不限於 SQL Server;可以使用任何數據源,只要數據可加載到 DataTable 實例或可使用 IDataReader 實例讀取數據。

具體可參考(http://msdn.microsoft.com/zh-cn/library/system.data.sqlclient.sqlbulkcopy(v=vs.80).aspx)

SqlBulkCopy.WriteToServer 方法有一下重載:

名稱 說明
SqlBulkCopy.WriteToServer (DataRow[]) 將所提供的 DataRow 數組中的所有行復制到 SqlBulkCopy 對象的 DestinationTableName 屬性指定的目標表中。
SqlBulkCopy.WriteToServer (DataTable) 將所提供的 DataTable 中的所有行復制到 SqlBulkCopy 對象的 DestinationTableName 屬性指定的目標表中。
SqlBulkCopy.WriteToServer (IDataReader) 將所提供的 IDataReader 中的所有行復制到 SqlBulkCopy 對象的 DestinationTableName 屬性指定的目標表中。
SqlBulkCopy.WriteToServer (DataTable, DataRowState) 只將與所提供 DataTable 中所提供行狀態匹配的行復制到 SqlBulkCopy 對象的DestinationTableName 屬性指定的目標表中。

我們如果使用此方式添加自己的ORM插入邏輯豈不是一件很爽的事情. 從接口上看可以提供IDataReader方式或者DataTable, DataRow. 我們做的只是要將我們對象適配到這些對象上去就好了. 具體選擇哪種方式去做呢?

方式一: DataTable, DataRow的方式是通過反射將所對象上的所有屬性都塞到DataTable, DataRow中. 然后傳遞給SqlBulkCopy.WriteToServer方法.

方式二: 適配層實現IDataReader接口, 然后根據需要將具體的屬性反射出來. (為何是根據需要才反射呢? 具體看參考一下IDataReader接口上的object GetValue(int i)方法)

顯然方式二更好些.

 

具體的代碼直接下載着看吧. http://files.cnblogs.com/cuiweifu/OrmForSqlBulkCopy.zip 我就不放這里挺礙眼的.

在我的機器上的測試結果如下.

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM