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 我就不放這里挺礙眼的.
在我的機器上的測試結果如下.