2016-12-19 8 views
0

レガシー・アプリケーションをOracle用の非推奨Microsoft .NETデータ・プロバイダ(Sql.Data.OracleClient.dll)をOracle独自の.Net ODPプロバイダ(OracleManagerDataAccess.dll)を使用して変換しています。最新のNugetパッケージデータベースサーバーがOracle 11gストアド・プロシージャをコールするときにOracle ODPデータ型エラーが発生しました

問題マイクロソフトのプロバイダを使用してアプリケーションがストアドプロシージャを呼び出すと問題はありませんが、Oracle ODPを使用して切り替えると、次のエラーが発生します。ストアドプロシージャ:

ORA-06502: PL/SQL: numeric or value error: character to number conversion error\nORA-06512: at line 1 

私がダウンして同じ問題を(下記参照)を示す非常に単純なコンソールアプリケーションにコードを蒸留しているが、私は、私はOracleのODPと違った何をする必要があるかうまくできません。アプリケーションから出力された '通常の' sqlを実行すると問題はないようです。

呼び出しIDbCommandオブジェクトは4つのパラメータを渡します。そのうちの2つは文字列であり、2つはintです。ストアド・プロシージャ・ヘッダは、.NETアプリケーションにだけデータプロバイダ、データベース内

PROCEDURE CreateSampleResults(varSampleCode SampleResults.SampleCode%TYPE, varTestPosition SampleResults.TestPosition%TYPE, varTestCode TestComponents.TestCode%TYPE, varTestVersion TestComponents.AuditNumber%TYPE) 

何も変わっていないです。コマンドパラメータのコレクションは、MicrosoftまたはOracleデータプロバイダのどちらを使用するかにかかわらず同一です。

ここでの問題を示す簡単なアプリケーションです:

using Oracle.ManagedDataAccess.Client; 
using System; 
using System.Collections.Generic; 
using System.Data; 
//using System.Data.OracleClient; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace oracleconnect 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      try 
      { 
       InitializeDBConnection(); 
       CreateSampleResults("S0106", "a", 2, 1); 
      } 
      finally 
      { 
       if (_con.State==System.Data.ConnectionState.Open) 
       _con.Close(); 
      } 
     } 

     static private OracleConnection _con; 
     private const string connectionString = 
     "Data Source = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = oracledbserver2)(PORT = 1521))(CONNECT_DATA = (SERVICE_NAME = orcdb10g))); User ID = myDatabasenameHere; Password=myPasswordhere"; 

     private static void InitializeDBConnection() 
     { 
      _con = new OracleConnection(); 
      _con.ConnectionString = connectionString; 
      _con.Open(); 
     } 

     public static IDbCommand CreateCommand(IDbConnection cn, string procedureName) 
     { 

      IDbCommand command = cn.CreateCommand(); 
      command.CommandTimeout = 30; 
      command.Connection = cn; 
      command.CommandType = System.Data.CommandType.StoredProcedure; 
      command.CommandText = procedureName; 

      return command; 
     } 

     public static void CreateSampleResults(string sampleCode, string testCode, short testVersion, short testPosition) 
     { 
      { 
       using (IDbCommand cmd = CreateCommand(_con, "CreateSampleResults")) 
       { 
        SetParameter("Oracle", cmd, "SampleCode", sampleCode); 
        SetParameter("Oracle", cmd, "TestCode", testCode); 
        SetParameter("Oracle", cmd, "TestVersion", testVersion); 
        SetParameter("Oracle", cmd, "TestPosition", testPosition); 
        cmd.ExecuteNonQuery(); 
       } 
      } 
     } 

     public static void SetParameter(string databaseType, IDbCommand command, string name, object value) 
     { 
      System.Data.IDataParameter commandParameter = command.CreateParameter(); 
      commandParameter.ParameterName = string.Format("var{0}", name); 
      commandParameter.Value = value; 
      var x = commandParameter.DbType; 
      command.Parameters.Add(commandParameter); 
     } 

     public enum DatabaseType { DBError, OLEDB, SQLServer, Oracle, /*SQLite,*/ Odbc }; 

    } 
} 

は、私はこの問題は、ストアドプロシージャ(つまり、テーブル名%のTYPE)で推定されたデータ型の使用に関連している可能性が疑われるが、それは推測です。 Oracle ODPで動作するストアド・プロシージャ・コールを取得するために何が必要なのか誰かが知っていますか?

TIA

+0

ない100%を確認してください、しかし、デフォルトではODP.NETは、位置によってではなく、名前でパラメータを結合することを、いくつかの思い出を持っています。 'SetParameter'呼び出しを並べ替えて、SPパラメータと一致させることができます。 –

+1

よろしく!それが爪の上にあります。ありがとう、そしてあまりにもダムであるためによく行われたオラクル。あなたが何かを置き換えているなら、少なくとも同じように動作させてください。 :-( –

答えて

関連する問題