Oracle数据的批量插入

本文介绍了一种从SQL Server高效导入数据至Oracle的方法,通过对比直接构建SQL语句和使用ADO.NET DataAdapter实现的批量插入性能,优化了数据导入流程。重点展示了如何在VB.NET环境下利用ADO.NET DataAdapter提高数据导入效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前两天接到一个需求——需要编程将SQL Server中的数据插入至Oracle。数据大约有20多万条记录。开始的时候我采取了直接构建SQL插入的方式,结果耗时太长。为了提高性能我上网找了资料。最终采用DataAdapter批量插入至Oracle,提高了性能。

代码如下:

一,直接构建SQL语句插入

VB.NET

         sw.Start()

         ''''Read Z02J from SQL Server

         Dim sqlCmd As New SqlCommand()

         sqlCmd.Connection = sqlConnection

         sqlCmd.CommandText = "SELECT * FROM  Z02J"

 6

         Dim sqlDr As SqlDataReader

         sqlDr = sqlCmd.ExecuteReader()

 9

10         Dim cmdInsertZ02J As New OracleCommand()

11         cmdInsertZ02J.Connection = oraConnection

12         cmdInsertZ02J.CommandText = BuildSQLStatement(SQLType.Insert,"z02j")

13

14         Dim plantLever, material, oldMaterialNum, materialDescription As Object

15         While sqlDr.Read()

16             plantLever = ReadSqlDataReader(sqlDr, 0, "")

17             material = ReadSqlDataReader(sqlDr, 1, "")

18             oldMaterialNum = ReadSqlDataReader(sqlDr, 2, "")

19             materialDescription = ReadSqlDataReader(sqlDr, 3, "")

20             ''Insert to Oracle table Z02J

21             cmdInsertZ02J.Parameters.AddWithValue(":plantLever", plantLever)

22             cmdInsertZ02J.Parameters.AddWithValue(":material", material)

23             cmdInsertZ02J.Parameters.AddWithValue(":oldMaterialNum", oldMaterialNum)

24             cmdInsertZ02J.Parameters.AddWithValue(":materialDescription", materialDescription)

25             cmdInsertZ02J.ExecuteNonQuery()

26         End While

27         sw.Stop()

28         Loger.Info("Reading z02j form sql sever used", sw.Elapsed.TotalSeconds.ToString())

二,采用DataAdapter实现批量插入

VB.NET

         sw.Start()

         ''''Read Z02J from SQL Server

         Dim sqlCmd As New SqlCommand()

         sqlCmd.Connection = sqlConnection

         sqlCmd.CommandText = "SELECT * FROM  Z02J"

 6

         Dim sqlDr As SqlDataReader

         sqlDr = sqlCmd.ExecuteReader()

 9

10         Dim cmdInsertZ02J As New OracleCommand()

11         cmdInsertZ02J.Connection = oraConnection

12         cmdInsertZ02J.CommandText = BuildSQLStatement(SQLType.Insert,"z02j")

13

14         Dim dtSqlZ02J As New DataTable

15         dtSqlZ02J.Columns.Add("plantLever")

16         dtSqlZ02J.Columns.Add("material")

17         dtSqlZ02J.Columns.Add("oldMaterialNum")

18         dtSqlZ02J.Columns.Add("materialDescription")

19

20         Dim plantLever, material, oldMaterialNum, materialDescription As Object

21         While sqlDr.Read()

22             plantLever = ReadSqlDataReader(sqlDr, 0, "")

23             material = ReadSqlDataReader(sqlDr, 1, "")

24             oldMaterialNum = ReadSqlDataReader(sqlDr, 2, "")

25             materialDescription = ReadSqlDataReader(sqlDr, 3, "")

26             dtSqlZ02J.Rows.Add(plantLever, material, oldMaterialNum, materialDescription)

27         End While

28         sw.Stop()

29         Loger.Info("Reading z02j form sql sever used", sw.Elapsed.TotalSeconds.ToString())

30

31         sw.Start()

32         Dim oraDa As New OracleDataAdapter()

33         oraDa.InsertCommand = cmdInsertZ02J

34         oraDa.InsertCommand.Parameters.Add(":plantLever", OracleType.Char, 255, "plantLever")

35         oraDa.InsertCommand.Parameters.Add(":material", OracleType.Char, 255, "material")

36         oraDa.InsertCommand.Parameters.Add(":oldMaterialNum", OracleType.Char, 255, "oldMaterialNum")

37         oraDa.InsertCommand.Parameters.Add(":materialDescription", OracleType.Char, 500, "materialDescription")

38

39         oraDa.InsertCommand.UpdatedRowSource = UpdateRowSource.None

40         oraDa.UpdateBatchSize = 20    '''Adjust the batch size based on testing result

41

42         oraDa.Update(dtSqlZ02J)

43         sw.Stop()

44         Loger.Info("Insert to oracle used", sw.Elapsed.TotalSeconds.ToString())
    在我的环境中批量插入24万笔记录用时大约260s左右。
    貌似SQL Server中。net驱动程序提供了SqlBulkCopy类来提高大量数据导入的性能。有需要的朋友可以查

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值