【发布时间】: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