OracleParameter.ArrayBindSize 无效,需要有关此问题的帮助

OracleParameter.ArrayBindSize is invalid, need some help on this issue

我正在执行一个 Oracle 存储过程,它具有三个输出参数,这些输出参数以 table 格式返回结果。我正在使用数组来捕获这些结果。在这里,我遇到了这个问题。还请验证我的东西,有道理吗?

   Dim cmd As New OracleCommand("PKG_HOBS.PRC_HOBS_GET_CLIENTID", FPP1_Connection)
    cmd.CommandType = CommandType.StoredProcedure


    Dim p1 As New OracleParameter(":obus_grp_id", OracleDbType.Int64, ParameterDirection.Output)
    p1.OracleDbType = OracleDbType.Int64
    p1.Direction = ParameterDirection.Output
    p1.CollectionType = OracleCollectionType.PLSQLAssociativeArray
    p1.Size = 100 ' This is the size of items in array in THIS case
    p1.ArrayBindSize = New Integer() {100}
    cmd.Parameters.Add(p1)

    Dim p2 As New OracleParameter(":ostat_c", OracleDbType.Int64, ParameterDirection.Output)
    p2.OracleDbType = OracleDbType.Int64
    p2.Direction = ParameterDirection.Output
    p2.CollectionType = OracleCollectionType.PLSQLAssociativeArray
    p2.Size = 100 ' This is the size of items in array in THIS case
    p2.ArrayBindSize = New Integer() {100}
    cmd.Parameters.Add(p2)

    Dim p3 As New OracleParameter(":ostat_msg_x", OracleDbType.Varchar2, 500, ParameterDirection.Output)
    p3.OracleDbType = OracleDbType.Varchar2
    p3.Direction = ParameterDirection.Output
    p3.CollectionType = OracleCollectionType.PLSQLAssociativeArray
    p3.Size = 500 ' This is the size of items in array in THIS case
    p3.ArrayBindSize = New Integer() {500}
    cmd.Parameters.Add(p3)

    FPP1_Connection.Open()
    cmd.ExecuteNonQuery()

我找到了这个问题的答案。希望它会对某些人有所帮助。我们必须使用 Enumerable.repeat 作为字符串数据类型。

     Dim cmd As New OracleCommand("PKG_HOBS.PRC_HOBS_GET_CLIENTID", FPP1_Connection)
      cmd.CommandType = CommandType.StoredProcedure


    'Passing three parameters and retriving the results in array
    Dim p1 As New OracleParameter("obus_grp_id", OracleDbType.Int64, ParameterDirection.Output)
    p1.CollectionType = OracleCollectionType.PLSQLAssociativeArray
    p1.Size = 100
    cmd.Parameters.Add(p1)

    Dim p2 As New OracleParameter("ostat_c", OracleDbType.Int64, ParameterDirection.Output)
    p2.CollectionType = OracleCollectionType.PLSQLAssociativeArray
    p2.Size = 100
    cmd.Parameters.Add(p2)

    Dim p3 As New OracleParameter("ostat_msg_x", OracleDbType.Varchar2, ParameterDirection.Output)
    p3.CollectionType = OracleCollectionType.PLSQLAssociativeArray
    p3.Size = 100
    p3.ArrayBindSize = Enumerable.Repeat(500, 100).ToArray 
    cmd.Parameters.Add(p3)

    cmd.ExecuteNonQuery()

    Try
        'Assigning each parameter values into local variables
        Dim oraobus_grp_id() As OracleDecimal = CType(p1.Value, OracleDecimal())
        Dim oraostat_c() As OracleDecimal = CType(p2.Value, OracleDecimal())
        Dim oraostat_msg_x() As OracleString = CType(p3.Value, OracleString())

        Dim obus_grp_idVal(oraobus_grp_id.Length - 1) As Long
        Dim ostat_cVal(oraostat_c.Length - 1) As Long
        Dim ostat_msg_xVal(oraostat_msg_x.Length - 1) As String

        For i As Integer = 0 To oraobus_grp_id.Length - 1
            obus_grp_idVal(i) = Convert.ToInt64(oraobus_grp_id(i).ToString)
            ostat_cVal(i) = Convert.ToInt64(oraostat_c(i).ToString)
            If ostat_cVal(i) <> "0" And ostat_cVal(i) <> "800" Then

                If Not oraostat_msg_x(i).IsNull Then
                    ostat_msg_xVal(i) = Convert.ToString(oraostat_msg_x(i).Value)
                    Dts.Events.FireError(-1, "", "Error response in new client retrieval: " + ostat_msg_xVal(i), "", 0)
                Else
                    ostat_msg_xVal(i) = Nothing
                    Dts.Events.FireError(-1, "", "Error response in new client retrieval: " + ostat_msg_xVal(i), "", 0)
                End If
            Else
                Call InsertClient(obus_grp_idVal(i))
            End If
        Next