【问题标题】:How do I convert a large number of OracleParameter declarations to use OracleDbTypeEx in ODP.Net?如何在 ODP.Net 中转换大量 OracleParameter 声明以使用 OracleDbTypeEx?
【发布时间】:2017-05-10 17:20:45
【问题描述】:

我正在处理另一个编写不佳的旧 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。我遗漏了什么,或者我需要遍历所有代码并手动更改参数声明?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2013-09-26
      • 1970-01-01
      • 1970-01-01
      • 2021-10-12
      • 2022-09-24
      • 1970-01-01
      • 2021-11-10
      • 2018-10-14
      • 1970-01-01
      相关资源
      最近更新 更多