Oracle から .net アプリケーションにデータを取得するために、最新の Oracle.ManagedDataAccess.Client 11.2 .dll を使用しています。ストアド プロシージャが期待するのと同じ順序でパラメータを渡す必要がありますか?
アプリケーション側から、コマンド オブジェクト cmd にパラメータ順序を追加します。
KK_C
KK_C2
KK_C1
のようなストアドプロシージャ
KK_C
KK_C1
KK_C2
これは汎用コードであり、ストアド プロシージャが期待する順序と同じ順序でパラメーターを渡すことができません。異なるストアド プロシージャは、異なるパラメーターの順序を想定しているため
私の方法:
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;