2016-12-19 7 views
0

Я конвертирую устаревшее приложение из использования устаревшего поставщика данных .Net для Oracle (Sql.Data.OracleClient.dll) для собственного поставщика ODP Oracle (OracleManagerDataAccess.dll), используя последний пакет Nuget. Сервер базы данных Oracle 11gТипы данных Oracle ODP ошибка при вызове хранимых процедур

Проблема, которую я не понимаю, заключается в том, что когда приложение вызывает хранимую процедуру с использованием поставщика 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 параметра, два из которых являются строковыми, а два являются 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 }; 

    } 
} 

Я подозреваю, что проблема может быть связана с использованием предполагаемых типов данных в хранимой процедуре (т.е. имя_таблица% TYPE), но это предположение. Кто-нибудь знает, что нужно сделать, чтобы получить вызовы хранимой процедуры для работы с Oracle ODP?

ТИА

+0

Не 100% уверен, но есть воспоминания, которые ODP.NET по умолчанию связывает параметры по позиции, а не по имени. Вы можете попробовать переупорядочить вызовы 'SetParameter' для соответствия параметрам SP. –

+1

Yay! Вот оно, на гвоздь. Спасибо, и хорошо сделано Oracle за то, что вы так глупы. если вы что-то замените, по крайней мере, сделайте так, чтобы он работал. :-( –

ответ

0

Вы должны добавить к вашему commandParameter DBTYPE базы данных. Ошибка связана с преобразованием типа в oracle, когда вызывается эта заключительная команда. Эта ошибка вызвана преобразованием commandParameter.Value в конечный тип базы данных.

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