使用VB.NET帮助批量化插入Oracle

时间:2010-02-01 21:05:50

标签: vb.net oracle10g system.data system.data.oracleclient

我一次插入一个包含5000条记录的块,一块接着一块。这些命令是在单独的DLL中创建的,可以调用4个不同存储过程中的任何一个。是否有批量插入方法可以加快这一点。相比之下,每条记录需要大约1.5 MS,并且希望将其降低到大约.7 MS。

谢谢,

戴夫

 Shared Sub WriteCMSMessagesToDatabase(ByVal myFacility As FacilityType, ByVal Commands As List(Of System.Data.OracleClient.OracleCommand))

    Dim oracleConnection As New OracleConnection
    Dim _Cmd As New OracleCommand

    Try
        Dim aStopWatch As New Stopwatch
        Using oracleConnection

            aStopWatch.Start()
            oracleConnection.ConnectionString = myFacility.ConnectionString
            _Cmd.Connection = oracleConnection
            _Cmd.CommandType = CommandType.StoredProcedure
            oracleConnection.Open()

            _Cmd.Transaction = oracleConnection.BeginTransaction

            For Each aCmd As OracleCommand In Commands
                _Cmd.CommandText = aCmd.CommandText
                _Cmd.Parameters.Clear()

                For Each aParam As OracleParameter In aCmd.Parameters
                    Dim prm As New OracleParameter
                    prm = CType(DirectCast(aParam, ICloneable).Clone, OracleParameter)
                    _Cmd.Parameters.Add(prm)
                Next

                _Cmd.ExecuteNonQuery()
            Next

            _Cmd.Transaction.Commit()
            aStopWatch.Stop()

        End Using

    Catch ex As Exception



    End Try


End Sub

2 个答案:

答案 0 :(得分:0)

如果您使用的是Oracle ODP.NET客户端,则可以通过将一组值绑定到查询中的每个参数来在单个数据库往返中插入多个记录,如herehere所示。我不确定System.Data.OracleClient类是否支持此功能,因此如果不支持,则可能不是一个选项,并且您无法更改提供程序。

答案 1 :(得分:0)

正如李说的那样,使用数组批量绑定。如果你不能这样做,你可以通过创建一个存储过程来伪装它,该存储过程需要大量的连接版本的参数

即。如果要插入1000行3列,则可以创建存储过程:

PROCEDURE bulk_ins(
  col1 VARCHAR2,
  cal2 VARCHAR2,
  col3 VARCHAR2
)
IS BEGIN
  FOR i in 0..20 LOOP
    INSERT INTO t (SUBSTR(col1, (20*i)+1, 20), SUBSTR(col2, (10*i)+1, 10), SUBSTR(col3, (30*i)+1, 30)); 
  END LOOP;
END;

然后在.net中建立你的参数,使它们成倍增加:

StringBuilder s1, s2, s3;
for(int i = 0; i<50; i++){
  s1.AppendFormat("{0:20}", col1value[i]);
  s2.AppendFormat("{0:10}", col2value[i]);
  s3.AppendFormat("{0:30}", col3value[i]);
}

然后调用proc。 请注意,您可能必须删除值的空格,但这几乎与批量绑定一样快。慢速部分是将数据导入oracle db。批量转移