我正在处理另一个写得不好的旧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
的形式返回。我缺少什么,或者我需要完成所有代码并手动更改参数声明?
答案 0 :(得分:0)
我发布此消息后不久,我找到了罪魁祸首。在填充之前将变量名称分配给参数,使其成为静态,然后再次调用以在代码中进一步获取值。我仍然需要调整这些电话,但它比整个声明的工作少。