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



我正在使用最新的Nuget包将遗留应用程序从使用已弃用的Oracle Microsoft.Net数据提供程序(Sql.Data.OracleClient.dll)转换为Oracle自己的.Net ODP提供程序(OracleManagerDataAccess.dll)。数据库服务器是 Oracle 11g

我不明白的一个问题是,当应用程序使用 Microsoft 提供程序调用存储过程时,这很好,但是当我切换到使用 Oracle ODP 时,我在调用存储过程时出现以下错误:

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

我已经将代码提炼成一个非常简单的控制台应用程序,该应用程序表现出相同的问题(见下文),但我无法弄清楚我需要用 Oracle ODP 做哪些不同的事情。执行从应用程序发出的"普通"sql似乎很好。

调用 IDbCommand 对象传递 4 个参数,其中两个是字符串,两个是整数。存储过程标头为

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 配合使用?

蒂亚

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

https://msdn.microsoft.com/en-us/library/system.data.idataparameter.dbtype(v=vs.110).aspx

相关内容

  • 没有找到相关文章

最新更新