Appelez la fonction de package Oracle en utilisant Odbc à partir de C #

J’ai une fonction définie dans un package Oracle:

CREATE OR REPLACE PACKAGE BODY TESTUSER.TESTPKG as FUNCTION testfunc(n IN NUMBER) RETURN NUMBER as begin return n + 1; end testfunc; end testpkg; / 

Comment puis-je l’appeler à partir de C # en utilisant Odbc? J’ai essayé ce qui suit:

 using System; using System.Data; using System.Data.Odbc; class Program { static void Main(ssortingng[] args) { using (OdbcConnection connection = new OdbcConnection("DSN=testdb;UID=testuser;PWD=testpwd")) { connection.Open(); OdbcCommand command = new OdbcCommand("TESTUSER.TESTPKG.testfunc", connection); command.CommandType = System.Data.CommandType.StoredProcedure; command.Parameters.Add("ret", OdbcType.Int).Direction = ParameterDirection.ReturnValue; command.Parameters.Add("n", OdbcType.Int).Direction = ParameterDirection.Input; command.Parameters["n"].Value = 42; command.ExecuteNonQuery(); Console.WriteLine(command.Parameters["ret"].Value); } } } 

Mais je reçois une exception disant “Instruction SQL non valide”.
Qu’est-ce que je fais mal?

Dans le passé, j’utilisais quelque chose de similaire à ce qui suit pour la chaîne de commande:

“{? = CALL JF_TESTUSER.TESTPKG.testFunc (?)}”

Voir l’ article suivant pour plus d’informations

essayer

 OdbcCommand command = new OdbcCommand("begin ? := TESTUSER.TESTPKG.testfunc(?) end;", connection); 

J’ai réussi à appeler la fonction du paquet comme ceci:

 command.CommandText = @"begin :ret := ILMTEST.testpkg.testfunc(:n); end;"; command.CommandType = System.Data.CommandType.Text; 

Je pense que vous devriez plutôt utiliser le Oracle Client .

Et si vous choisissez ODBC simplement pour créer un DSN et que vous vous y connectez pour être en quelque sorte agnostique à la firebase database, envisagez d’utiliser le Data Access Application Block Enterprise Library Data Access Application Block .