3 Replies Latest reply: Dec 12, 2011 2:12 AM by Takashi Matsuoka RSS

    ODP.NET(10g)を使用してPL/SQL実行するとコマンドのパラメータが消えてしまう

    902104
      C#.NET+ODP.NET(9i)で作成し、動作していたプログラムを10g対応すべく参照設定の変更を行いました。
      作成したプログラムを実行すると今まで動いていた機能が動かなくなり、
      調査したところ(デバッグ実行)、コマンドに指定しているパラメータ(複数ある配列化したもの)が
      全てExecuteScalarで実行後に消えてしまうという現象が出ていることが判明しました。

      Webで調べてみても何ら情報がなくどのように回避すればよいか困っております。
      今までに実行したことは、
       配列順番入れ替え→×
       9iに再度戻して実行→○
       ExecuteNonQueryで実行→×
       その他実行関連ソースの手直し→×
      です。

      もし上記と同様な現象を回避できた方がおられましたらご教授いただけませんでしょうか?
      よろしくお願いいたします。
        • 1. Re: ODP.NET(10g)を使用してPL/SQL実行するとコマンドのパラメータが消えてしまう
          Takashi Matsuoka
          1.10g対応した場合の、ODP.NETのバージョンは?
          2.部分的でも良いのでサンプルコード提供いただけませんか?
          • 2. Re: ODP.NET(10g)を使用してPL/SQL実行するとコマンドのパラメータが消えてしまう
            902104
            ご回答ありがとうございます。
            1.10g対応した場合の、ODP.NETのバージョンは?
            →「Oracle 10g Release 2 ODAC 10.2.0.2.21」をサイトよりダウンロードしインストールしております
            2.部分的でも良いのでサンプルコード提供いただけませんか?
            →下記に部分的ですが記載します

             ①パラメータ定義部
             AC_ODPOracle.AC_ODPOracle_Parameter("in_func_id",cmd,OracleDbType.Varchar2,ParameterDirection.Input,"ABCDE");
             AC_ODPOracle.AC_ODPOracle_Parameter("in_fname",cmd,OracleDbType.Varchar2,ParameterDirection.Input,"ABCDE");
             AC_ODPOracle.AC_ODPOracle_Parameter("in_dept_cd",cmd,OracleDbType.Varchar2,ParameterDirection.Input,paramList[0]);
             AC_ODPOracle.AC_ODPOracle_Parameter("in_user_id",cmd,OracleDbType.Varchar2,ParameterDirection.Input,paramList[1]);
             AC_ODPOracle.AC_ODPOracle_Parameter("in_information",cmd,OracleDbType.Varchar2,ParameterDirection.Input,paramList[2]);
             AC_ODPOracle.AC_ODPOracle_Parameter("out_rtncd",cmd,OracleDbType.Decimal,ParameterDirection.Output,null);

             ②PL/SQL実行部(メソッド呼び出し)
             AC_ODPOracle.AC_ODPOracle_Execute(cmd)

             ③PL/SQL実行部(メソッド内)
             // Command状態確認
             if (Pr_OraCommand == null)
             {
                  return(false);
             }
             if (Pr_OraCommand.Connection.State == System.Data.ConnectionState.Closed)
             {
                  return(false);
             }
             // Command実行
             Pr_OraCommand.ExecuteScalar();
             Pr_OraCommand.Dispose();

            こちらでも既存部品(PL/SQLなどの実行用に作成したもの)を経由して実行しているので、
            もしかしたらそのあたりかとも思っておりますが、何とも言えないのが現状です。
            サンプルで最小限の実行プログラムを作成してみて確認しようと思っています。

            引き続き何か情報などがありましたらご教授お願いいたします。
            • 3. Re: ODP.NET(10g)を使用してPL/SQL実行するとコマンドのパラメータが消えてしまう
              Takashi Matsuoka
              手元に、ODAC 10.2.0.2.21を用意できなかったので...
              下記環境で確認しましたが、再現されませんでした。

              Q1.「Pr_OraCommand.ExecuteScalar();」の直前と直後で、どのような手段で、どの変数を確認して、”全てExecuteScalarで実行後に消えてしまう”と確認されましたか?
              Q2.そちらの環境では、下記コードで事象再現しますか?

              ■テスト環境
              ・Oracle Database 11g 11.2.0.2.0 32bit for Windows
              ・ODP.NETならびにOCIは、Oracle Databaseに同封のものを使用
              ・Visual C# 2010 Express SP1
              ・.NET Framework 4 Client Profile
              using System;
              using System.Collections.Generic;
              using System.Linq;
              using System.Text;
              using Oracle.DataAccess.Client;
              
              
              namespace ConsoleApplication1
              {
                  class Program
                  {
                      static void Main(string[] args)
                      {
                          var factory = new OracleClientFactory();
                          var connectionString = factory.CreateConnectionStringBuilder();
                          connectionString.Add("User ID", "system");
                          connectionString.Add("Password", "manager");
                          using (var connection = factory.CreateConnection())
                          {
                              connection.ConnectionString = connectionString.ToString();
              
                              connection.Open();
                              using (var command = connection.CreateCommand())
                              {
                                  command.CommandType = System.Data.CommandType.StoredProcedure;
                                  command.CommandText = "TEST";
              
                                  var paramList = new string[] { "ABCDE", "ABCDE", "ABCDE" };
              
                                  var parameter = command.CreateParameter();
                                  parameter.ParameterName = "IN_FUNC_ID";
                                  parameter.DbType = System.Data.DbType.String;
                                  parameter.Direction = System.Data.ParameterDirection.Input;
                                  parameter.Value = "ABCDE";
                                  command.Parameters.Add(parameter);
              
                                  parameter = command.CreateParameter();
                                  parameter.ParameterName = "IN_FNAME";
                                  parameter.DbType = System.Data.DbType.String;
                                  parameter.Direction = System.Data.ParameterDirection.Input;
                                  parameter.Value = "ABCDE";
                                  command.Parameters.Add(parameter);
              
                                  parameter = command.CreateParameter();
                                  parameter.ParameterName = "IN_DEPT_CD";
                                  parameter.DbType = System.Data.DbType.String;
                                  parameter.Direction = System.Data.ParameterDirection.Input;
                                  parameter.Value = paramList[0];
                                  command.Parameters.Add(parameter);
              
                                  parameter = command.CreateParameter();
                                  parameter.ParameterName = "IN_USER_ID";
                                  parameter.DbType = System.Data.DbType.String;
                                  parameter.Direction = System.Data.ParameterDirection.Input;
                                  parameter.Value = paramList[1];
                                  command.Parameters.Add(parameter);
              
                                  parameter = command.CreateParameter();
                                  parameter.ParameterName = "IN_INFORMATION";
                                  parameter.DbType = System.Data.DbType.String;
                                  parameter.Direction = System.Data.ParameterDirection.Input;
                                  parameter.Value = paramList[2];
                                  command.Parameters.Add(parameter);
              
                                  parameter = command.CreateParameter();
                                  parameter.ParameterName = "OUT_RTNCD";
                                  parameter.DbType = System.Data.DbType.Decimal;
                                  parameter.Direction = System.Data.ParameterDirection.Output;
                                  command.Parameters.Add(parameter);
              
                                  Console.WriteLine(command.Parameters.Count);
                                  Console.WriteLine(paramList.Length);
                                  var result = command.ExecuteScalar();
                                  Console.WriteLine(command.Parameters.Count);
                                  Console.WriteLine(paramList.Length);
                              }
                              connection.Close();
                          }
              
                          Console.ReadLine();
                      }
                  }
              }