上周我正在审查一个ASP.NET Visual Basic WebSite-Project,发现下面的代码片段(对我来说)非常奇怪。
Using Connection As New OracleConnection(ConnMain)
Connection.Open()
Dim Command As OracleCommand = Connection.CreateCommand()
Dim Transaction As OracleTransaction
Dim Reader As OracleDataReader
Dim Sql As New StringBuilder
Transaction = Connection.BeginTransaction()
Command.Transaction = Transaction
Try
Sql.Length = 0
Sql.Append(" INSERT INTO DEMOTABLE (VALID, ")
Sql.Append(" DB_NR, ")
Sql.Append(" CREATED_DATE, ")
Sql.Append(" CREATED_BY) ")
Sql.Append(" VALUES ('Yes', ")
Sql.Append(" :DB_NR_P, ")
Sql.Append(" SYSDATE, ")
Sql.Append(" :CREATED_BY_P) ")
Sql.Append(" RETURNING DEMOTABLE_ID ")
Sql.Append(" INTO :DEMOTABLE_ID_P ")
Command.CommandText = Convert.ToString(Sql)
Command.Parameters.Clear()
Command.Parameters.AddWithValue("DB_NR_P", ddlFirm.SelectedValue)
Command.Parameters.AddWithValue("CREATED_BY_P", UserId)
Dim DlcKombParam As OracleParameter = Command.Parameters.AddWithValue("DEMOTABLE_ID_P", "")
DlcKombParam.Direction = ParameterDirection.Output
DlcKombParam.Size = 255
Command.ExecuteNonQuery()
'handling the output-parameter
Transaction.Commit()
Catch Ex As Exception
Transaction.Rollback()
WriteLog(Convert.ToString(Ex))
End Try
End Using
混淆是输出参数。编程这件作品的人使用与我相同的设置,唯一的区别是,他正在使用ODAC 11.2而我的机器已经在12.1上。 (.Net 3.5,Oracle-DB 12.1,System.Data.OracleClient)。在具有ODAC 11.2的所有计算机上(在三个不同的计算机上测试),该参数包含新插入行的ID。在我的机器上,参数仅包含五位ID的前两位数字。 更改参数(见下文)后,两个ODAC版本都正确返回了ID。
Dim DlcKombParam As New OracleParameter
DlcKombParam.ParameterName = "WEK_DLCKOMB_ID_P"
DlcKombParam.Direction = ParameterDirection.Output
DlcKombParam.OracleType = OracleType.Number
我的问题是:为什么新的ODAC版本只返回ID的前两位数字?我会理解它是否返回了错误(因为原始代码中的参数被添加为字符串,这可能在新版本中被归类为错误),或者甚至可能是空字符串。 但我无法理解为什么它只会返回部分价值......任何人都有任何想法?