问题
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?
From application side we are add parameter order to command object cmd is
KK_C
KK_C2
KK_C1
Stored procedure like
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
My method:
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
}
Stored procedure:
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;
回答1:
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
Unfortunately, this property is not true by default (maybe for performance reasons)...
来源:https://stackoverflow.com/questions/17214908/parameter-order-is-incorrect-when-calling-oracle-stored-procedures-using-oracle