【问题标题】:Inserting in Oracle DB from vb.net application retuning value从 vb.net 应用程序重新调整值插入 Oracle DB
【发布时间】:2021-06-18 11:43:29
【问题描述】:

我正在继续学习使用 Oracle……但这并不容易…… 我想用参数插入并返回一个值

Public Function InsertMapping(GeneralDatas As List(Of String)) As Decimal
    Dim idobj As Decimal = 4563
    Dim Ref As String = "A85693_B" 
    Dim nbversion = 1
    Dim idroutting As Decimal
    Using con As OracleConnection = GetConnexion()
        cmd As New OracleCommand With {.Connection = con}
        cmd.CommandText = "insert into ROUTING
(DESCRIPTION, DRAFT_NUMBER, DRAFT_VERSION,
 ESTIMATE,ID_COMPANY,ID_CUSTOMER,ID_ROUTING_TYPE,
 ID_STATUS,REFERENCE,RELEASE,REVISION,SCRAP_PCENT,
 SCRAP_QUANTITY,VERSION,ID_OBJECT) 
values(:desc,:noplan,:indplan,0,
    1,:idclt,4,381,
    :ref,0,0,0,0,
    :voir,:idobj) returning ID_ROUTING into :monid"
        cmd.CommandType = CommandType.Text

        Dim prm = New OracleParameter("monid", OracleDbType.Decimal)
        prm.Direction = ParameterDirection.ReturnValue
        cmd.Parameters.Add(prm)

        Dim prm1 = New OracleParameter("desc", OracleDbType.Varchar2)
        prm1.Direction = ParameterDirection.Input
        prm1.Value = ""
        cmd.Parameters.Add(prm1)

        Dim prm2 = New OracleParameter("noplan", OracleDbType.Varchar2)
        prm2.Direction = ParameterDirection.Input
        prm2.Value = "Cloison"
        cmd.Parameters.Add(prm2)

        Dim prm3 = New OracleParameter("indplan", OracleDbType.Varchar2)
        prm3.Direction = ParameterDirection.Input
        prm3.Value = ""
        cmd.Parameters.Add(prm3)

        Dim prm4 = New OracleParameter("idclt", OracleDbType.Decimal)'Number(20,0)
        prm4.Direction = ParameterDirection.Input
        prm4.Value = 5
        cmd.Parameters.Add(prm4)

        Dim prm5 = New OracleParameter("ref", OracleDbType.Varchar2)
        prm5.Direction = ParameterDirection.Input
        prm5.Value = Ref
        cmd.Parameters.Add(prm5)

        Dim prm6 = New OracleParameter("voir", OracleDbType.Varchar2)
        prm6.Direction = ParameterDirection.Input
        prm6.Value = "1"
        cmd.Parameters.Add(prm6)

        Dim prm7 = New OracleParameter("idobj", OracleDbType.Decimal)
        prm7.Direction = ParameterDirection.Input
        prm7.Value = idobj
        cmd.Parameters.Add(prm7) 

        con.Open()
        cmd.ExecuteNonQuery()'<------Error here
        HelperJournal.WriteEntry("after excecute")
        idroutting = cmd.Parameters("monid").Value.ToString
    End Using
    HelperJournal.WriteEntry("idroutting", idroutting)
        
    Return idroutting
End Function

这里是我的错误信息

消息:ORA-01745: nom de variable hôte/attachée (bind) 无效 异常:Oracle.ManagedDataAccess.Client.OracleException (0x80004005): ORA-01745: nom de variable hôte/attachée (bind) non valide à OracleInternal.ServiceObjects.OracleConnectionImpl.VerifyExecution(Int32& cursorId, Boolean bThrowArrayBindRelatedErrors, SqlStatementType sqlStatementType, Int32 arrayBindCount, OracleException& exceptionForArrayBindDML, Boolean& hasMoreRowsInDB, Boolean bFirstIterationDone) àOracleInternal.ServiceObjects.OracleCommandImpl.ExecuteNonQuery(字符串的CommandText,OracleParameterCollection paramColl,的CommandType命令类型,OracleConnectionImpl connectionImpl,的Int32 longFetchSize,Int64的clientInitialLOBFS,OracleDependencyImpl orclDependencyImpl,Int64的[]&scnFromExecution,OracleParameterCollection&bindByPositionParamColl,布尔逻辑bBindParamPresent,OracleException&exceptionForArrayBindDML,连接的OracleConnection,OracleLogicalTransaction&oracleLogicalTransaction , 布尔值是FromEF) à Oracle.ManagedDataAccess.Client.OracleCommand.ExecuteNonQuery()

我读了很多遍都没有看到参数有什么不好的链接... 感谢您的帮助

【问题讨论】:

  • 尽量减少,直到只剩下制造麻烦的列。
  • 我认为对于 Oracle,参数的顺序很重要。 OracleParameters 必须与它们在 SQL 语句中出现的顺序相同 - 尝试将 monid 参数移动到列表末尾以匹配 SQL

标签: oracle vb.net ado.net odp.net-managed


【解决方案1】:

这个

Dim prm = New OracleParameter("monid", OracleDbType.Decimal)
prm.Direction = ParameterDirection.ReturnValue 

应该是最后一个方向应该是输出

' all parameters first ^^^
Dim prm = New OracleParameter("monid", OracleDbType.Decimal)
prm.Direction = ParameterDirection.Output ' <-- here

con.Open()
cmd.ExecuteNonQuery()

此外,ODP OracleCommand 具有 BindByName 属性。如果你设置cmd.BindByName = True,你可以有任意顺序的参数

【讨论】:

  • 我也添加了我更改了 2 个参数的名称: Ref 和 desc 原因可以在 Oracle 中已经知道。但我听从了你的建议,没关系,然后我认为你纠正了未来的错误:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多