レガシー・アプリケーションを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
ない100%を確認してください、しかし、デフォルトではODP.NETは、位置によってではなく、名前でパラメータを結合することを、いくつかの思い出を持っています。 'SetParameter'呼び出しを並べ替えて、SPパラメータと一致させることができます。 –
よろしく!それが爪の上にあります。ありがとう、そしてあまりにもダムであるためによく行われたオラクル。あなたが何かを置き換えているなら、少なくとも同じように動作させてください。 :-( –