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
.