使用 Oracle.ManagedDataAccess.Client 调用 Oracle 存储过程时参数顺序不正确 [英] Parameter order is incorrect when calling Oracle stored procedures using Oracle.ManagedDataAccess.Client

查看:674
本文介绍了使用 Oracle.ManagedDataAccess.Client 调用 Oracle 存储过程时参数顺序不正确的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用最新的 Oracle.ManagedDataAccess.Client 11.2 .dll 将数据从 Oracle 获取到 .net 应用程序.是否需要按照存储过程预期的顺序传递参数?

I am using latest Oracle.ManagedDataAccess.Client 11.2 .dll for getting data from Oracle to .net application. Is it required to pass parameter in same order as expected by the stored procedure?

从应用程序端,我们将参数顺序添加到命令对象 cmd 是

From application side we are add parameter order to command object cmd is

KK_C
KK_C2
KK_C1

存储过程如

KK_C
KK_C1
KK_C2

这是通用代码,我无法按照存储过程预期的顺序传递参数.因为不同的存储过程期望不同的参数顺序

And this is generic code I am not able pass parameter same order what the stored procedure expected. Because different stored procedures expect different parameter order

我的方法:

Public Function GetDataTable(ByRef xmlParams As XmlNodeList) As DataTable
{
     Dim param As OracleParameter

     Dim params As List(Of OracleParameter) = New List(Of OracleParameter)()

     For Each node As XmlNode In xmlParams

param = New OracleParameter()

param.ParameterName = Convert.ToString(node.SelectSingleNode("name").InnerText)

param.OracleDbType = CType("112", OracleDbType)

 param.Value =Convert.ToString(node.SelectSingleNode("name").InnerText)


   Next

 Dim addparam As OracleParameter
            Dim cmd As OracleCommand
            Dim objdt As DataTable
            OpenConnection()
            cmd = New OracleCommand()           
            cmd.Connection = _oracleConn            
            cmd.CommandText = sql           
            cmd.CommandType = CommandType.StoredProcedure           

            If Not params Is Nothing Then
                For Each param As OracleParameter In params             
                    addparam = New OracleParameter()

                    With addparam                   
                        .Direction = param.Direction
                        .OracleDbType = param.OracleDbType 
                        If Left(param.ParameterName, 2) <> "KK_" Then
                            .ParameterName = "KK_" & param.ParameterName
                        Else
                            .ParameterName = param.ParameterName
                        End If
                        .Size = param.Size
                        .Value = param.Value
                    End With
                    cmd.Parameters.Add(addparam)

                Next
            End If

            addparam = New OracleParameter("OO_remcursor", OracleDbType.RefCursor)
            addparam.Direction = ParameterDirection.Output
            cmd.Parameters.Add(addparam)

            'fill the datatable
            objdt = New DataTable(tblname)

            Using objda As New OracleDataAdapter(cmd)

                objda.Fill(objdt)

            End Using
            Return objdt
}

存储过程:

PROCEDURE GetDATA(KK_C IN NUMBER,KK_C1 IN NUMBER, KK_C2 IN NUMBER OO_remCursor OUT o_Cursor)
    AS
    BEGIN
        OPEN o_remCursor FOR
        SELECT ....        ORDER BY LOWER(brand_alias);

    END GetDATA;

推荐答案

正如 "Praveen G" 所建议的,如果你想调用带有命名参数的存储过程而不考虑参数声明顺序,只需设置 "BindByName"为真

As suggested by "Praveen G", if you want to call a stored procedure with named parameters without taking care of the paramaters declaration order, simply set "BindByName" to true

cmd.BindByName = True

不幸的是,默认情况下此属性不是 true(可能是出于性能原因)...

Unfortunately, this property is not true by default (maybe for performance reasons)...

这篇关于使用 Oracle.ManagedDataAccess.Client 调用 Oracle 存储过程时参数顺序不正确的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆