如何使用SQLBulkCopy将数据从DataReader流到SQL



我需要创建一个桌面应用程序,以将数据从Oracle数据库复制到SQL Server数据库(客户端明确希望此 - ETL软件,DTS等都已退出 - 它必须是桌面 *.exe(

当数据运行到数百万(通常数千万(行的行中时,我不能使用sqlbulkcopy(dataTable(作为数据表的大小,很快就会使用所有可用的内存。

我正在使用sqlbulkcopy(datareader(,但仍在消耗本地内存。

如何不使用大量本地内存?

(跳过try-catches等,只是核心代码(:

Dim dr As OleDb.OleDbDataReader
Dim connString As String = "Provider=MSDAORA.1;User ID=X;password=X;Data Source=X;Persist Security Info=False"
Dim cnn As OleDb.OleDbConnection = New OleDb.OleDbConnection(connString)
Dim cmd As OleDb.OleDbCommand = New OleDb.OleDbCommand("SELECT * FROM Table", cnn)
cnn.open
dr = cmd.ExecuteReader
Dim sqlCnn As SqlClient.SqlConnection = New SqlClient.SqlConnection("Server=X;Database=X;Trusted_Connection=True;Connection Timeout=60")
sqlCnn.Open()
Dim bk As SqlClient.SqlBulkCopy = New SqlClient.SqlBulkCopy(sqlCnn)
bk.DestinationTableName = "TABLE_NAME"
bk.EnableStreaming = True
bk.BatchSize = 100
bk.BulkCopyTimeout = 0
bk.WriteToServer(dr)  

无论批处理大小如何,在本地机器上抛出了内存异常。页面文件使用情况在垂死之前上升。期望DataReader流到SQL Server,因此不会使用太多本地内存

感谢Jeroen使用Oracle本机提供者而不是Ole。

"官方Oracle Odp.net托管驱动程序"

数据现在快速流式传输(每秒10,000行(,并且不会过分消耗本地内存,正是我所寻找的。

新代码(错过try-catch等,只是代码(:

'Oracle connection using ODP.Net Managed Driver
Dim factory As Common.DbProviderFactory = Common.DbProviderFactories.GetFactory("Oracle.DataAccess.Client")
Dim dbconn As Common.DbConnection = factory.CreateConnection()
Dim connString As String = "User ID=X;password=X;Data Source=X;"
dbconn.ConnectionString = connString
dbconn.Open()
'Retrieval of data from oracle
Dim dbcommand = factory.CreateCommand
dbcommand.Connection = dbconn
dbcommand.CommandText = "SELECT * FROM Table"
Dim dr As Common.DbDataReader
dr = dbcommand.ExecuteReader
'Stream to SQL
Dim sqlCnn As SqlClient.SqlConnection = New 
SqlClient.SqlConnection("Server=X;Database=X;Trusted_Connection=True;Connection Timeout=60")
sqlCnn.Open()
Dim bk As SqlClient.SqlBulkCopy = New SqlClient.SqlBulkCopy(sqlCnn)
bk.DestinationTableName = "TABLE_NAME"
bk.EnableStreaming = True
bk.BatchSize = 5000
bk.BulkCopyTimeout = 0
bk.WriteToServer(dr)

最新更新