如何在ODP.Net中转换大量OracleParameter声明以使用OracleDbTypeEx?

时间:2017-05-10 17:20:45

标签: vb.net oracle type-conversion odp.net

我正在处理另一个写得不好的旧VB应用程序,该应用程序使用System.Data.Client并使用旧版本的Oracle工作.Net 1.1。需要更新它以使用3.5和ODP.Net Oracle库。该项目大多是繁琐的清理,如实施usings和类似,但我已经碰壁了。

我们所有的方法和函数只是随便在返回值中假设.Net数据类型。有很多懒惰的编码,甚至参数都没有被.Value检查,并且某些东西仍然有效。自升级以来,这些方法不再有效,特别是在给定查询的结果不再返回.Net数据类型的情况下。我已经克服了大多数问题,但有一个问题可能会变成我打字的一周,而我正试图找到解决办法。

我们有很多OracleParameter值,如下所示:

 cmd.Parameters.Add("aNumber", OracleDbType.Double)
 cmd.Parameters(cmd.Parameters.Count -1).Direction  = ParameterDirection.Output

这里的问题是OracleDbType属性已设置,但不是OracleDbTypeEx,它返回可由现有代码消化的.Net数据类型。我没有重写数百个参数声明,而是尝试了以下修复:

 clsMisc.Prepare(cmd)
 cmd.ExecuteNonQuery()

在我的" clsMisc"类:

Public Shared Sub Prepare(ByRef cmd As OracleCommand)
        If (Not cmd.CommandType = CommandType.StoredProcedure) Then
            Return
        End If

        Dim oc As New List(Of OracleParameter)
        For Each p As OracleParameter In cmd.Parameters
            If p.Direction = ParameterDirection.InputOutput Or p.Direction = ParameterDirection.Output Or p.Direction = ParameterDirection.ReturnValue Then

                Dim param = New OracleParameter() With { _
                    .OracleDbTypeEx = p.OracleDbType,
                    .ParameterName = p.ParameterName,
                    .Direction = p.Direction,
                    .Size = p.Size
                }
                oc.Add(param)                   
            Else
                oc.Add(p)
            End If
        Next
        cmd.Parameters.Clear()
        cmd.BindByName = True
        For Each op As OracleParameter In oc
            cmd.Parameters.Add(op)
        Next
    End Sub

不幸的是,即使编译并运行,我也会从查询中得到两个不同的结果。没有我的修复,我得到的值,但错误的数据类型。使用我的修复程序时,所有返回值和输出值都会以Nothing的形式返回。我缺少什么,或者我需要完成所有代码并手动更改参数声明?

1 个答案:

答案 0 :(得分:0)

我发布此消息后不久,我找到了罪魁祸首。在填充之前将变量名称分配给参数,使其成为静态,然后再次调用以在代码中进一步获取值。我仍然需要调整这些电话,但它比整个声明的工作少。