C# Oracle ODP数据类型调用存储过程时出错

C# Oracle ODP数据类型调用存储过程时出错,c#,.net,stored-procedures,oracleclient,oraclecommand,C#,.net,Stored Procedures,Oracleclient,Oraclecommand,我正在使用最新的Nuget软件包将旧版应用程序从使用不推荐的Microsoft.Net Oracle数据提供程序(Sql.data.OracleClient.dll)转换为Oracle自己的.Net ODP提供程序(OracleManagerDataAccess.dll)。数据库服务器是Oracle11g 我不理解的一个问题是,当应用程序使用Microsoft提供程序调用存储过程时,这是正常的,但当我切换到使用Oracle ODP时,调用存储过程时会出现以下错误: ORA-06502: PL/S

我正在使用最新的Nuget软件包将旧版应用程序从使用不推荐的Microsoft.Net Oracle数据提供程序(Sql.data.OracleClient.dll)转换为Oracle自己的.Net ODP提供程序(OracleManagerDataAccess.dll)。数据库服务器是Oracle11g

我不理解的一个问题是,当应用程序使用Microsoft提供程序调用存储过程时,这是正常的,但当我切换到使用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个参数,其中两个是string,两个是int。存储过程头是

PROCEDURE  CreateSampleResults(varSampleCode SampleResults.SampleCode%TYPE, varTestPosition SampleResults.TestPosition%TYPE, varTestCode TestComponents.TestCode%TYPE, varTestVersion TestComponents.AuditNumber%TYPE) 
数据库中没有任何更改,只有.Net应用程序中的数据提供程序发生了更改。无论是使用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 };

    }
}
我怀疑问题可能与在存储过程中使用推断数据类型(即tablename%TYPE)有关,但这只是猜测。有人知道需要做什么才能让存储过程调用与Oracle ODP一起工作吗


TIA

您应该将数据库数据库数据库类型添加到
commandParameter
中。该错误与调用最终命令时oracle中的类型转换有关。此错误是由将
commandParameter.Value
转换为最终数据库类型引起的


您应该将数据库DbType添加到
命令参数中。该错误与调用最终命令时oracle中的类型转换有关。此错误是由将
commandParameter.Value
转换为最终数据库类型引起的


不是100%确定,但有一些记忆,ODP.NET默认情况下会按位置而不是名称绑定参数。您可以尝试重新排序
SetParameter
调用以匹配SP参数。耶!就是这样,一针见血。谢谢,做得好,神谕如此愚蠢。如果你要更换某些东西,至少要让它以同样的方式工作-(不是100%确定,但有一些记忆,ODP.NET默认情况下按位置而不是按名称绑定参数。您可以尝试重新排序
SetParameter
调用以匹配SP参数。耶!就是这样,一针见血。谢谢,Oracle做得很好,因为它如此愚蠢。如果您要替换某些东西,至少要让它以相同的方式工作。:-(