2010-03-25 8 views
1

Salutations, tousOracle - Obtenir Sélectionnez Count (*) de ... en tant que paramètre de sortie dans System.Data.OracleClient

J'ai une question. J'essaye de construire une requête paramétrée pour m'obtenir le nombre de rangées d'une table dans Oracle. Plutôt simple. Cependant, je suis un débutant Oracle ..

Je sais que dans SQL Server, vous pouvez faire quelque chose comme:

Select @outputVariable = count(*) from sometable where name = @SomeOtherVariable

et vous pouvez configurer un paramètre de sortie dans le System.Data.SqlClient pour obtenir le @outputVariable.

Penser que l'on devrait être en mesure de le faire dans Oracle ainsi, je la requête suivante

Select count(*) into :theCount from sometable where name = :SomeValue

Je mis mes paramètres d'oracle (en utilisant System.Data.OracleClient - oui je sais que ce sera dépréciée en .Net 4 - mais c'est ce que je travaille avec pour l'instant) comme suit

IDbCommand command = new OracleCommand(); 
command.CommandText = "Select count(*) into :theCount from sometable where name = :SomeValue"; 
command.CommandType = CommandType.Text; 

OracleParameter parameterTheCount = new OracleParameter(":theCount", OracleType.Number); 
parameterTheCount .Direction = ParameterDirection.Output; 
command.Parameters.Add(parameterTheCount); 

OracleParameter parameterSomeValue = new OracleParameter(":SomeValue", OracleType.VarChar, 40); 
parameterSomeValue .Direction = ParameterDirection.Input; 
parameterSomeValue .Value = "TheValueToLookFor"; 
command.Parameters.Add(parameterSomeValue); 
command.Connection = myconnectionObject; 
command.ExecuteNonQuery(); 
int theCount = (int)parameterTheCount.Value; 

à ce moment-là, j'espérais que le nombre serait dans le paramètre parameterTheCount que je pouvais facilement accéder.

Je continue d'obtenir l'erreur ora-01036 qui http://ora-01036.ora-code.com me dit de vérifier ma liaison dans l'instruction SQL. Suis-je quelque chose dans la déclaration SQL? Ai-je manqué quelque chose de simple ailleurs?

Je pourrais juste utiliser command.ExecuteScaler() car je ne reçois qu'un seul article, et je vais probablement finir par l'utiliser, mais à ce stade, la curiosité a eu raison de moi. Que faire si j'avais deux paramètres que je voulais revenir de ma requête (par exemple: select max (IVC), min (ColB) en: max,: min .....)

Merci ..

Répondre

2

Certaines versions de l'ADO n'ont pas besoin des deux-points : configurant OracleParameter.

Au lieu de:

new OracleParameter(":theCount", OracleType.Number); 

essayer

new OracleParameter("theCount", OracleType.Number); 

Quoi qu'il en soit, je pense que vous devez utiliser la fonction ExecuteScalar() du IDbCommand et en évitant l'utilisation de into (que je ne suis pas sûr qu'il est valide dans ce contexte). Je veux dire:

IDbCommand command = new OracleCommand(); 
command.CommandText = "Select count(*) from sometable where name = :SomeValue"; 
command.CommandType = CommandType.Text; 

OracleParameter parameterSomeValue = new OracleParameter("SomeValue", OracleType.VarChar, 40); 
parameterSomeValue .Direction = ParameterDirection.Input; 
parameterSomeValue .Value = "TheValueToLookFor"; 
command.Parameters.Add(parameterSomeValue); 
command.Connection = myconnectionObject; 
int theCount = (int)command.ExecuteScalar(); 

Avertissement: Le code n'a pas été compilé, et peut-être avoir une petite erreur.

Mise à jour: Si vous jetez un coup d'oeil sur la syntaxe Oracle SELECT, vous verrez que la phrase SELECT INTO n'est pas reconnu. Mais il est valide dans la syntaxe PLSQL comme vous pouvez le voir here. Vous pouvez essayer une des options suivantes pour voir si cela fonctionne (non testé):

command.CommandText = "begin Select count(*) into :someCount from sometable where name = :SomeValue; end;"; 
+0

Salutations, J'ai essayé d'enlever les: dans le nom sur les définitions de paramètres. Aucun effet. J'ai fini par utiliser ExecuteScaler. Je suis toujours intéressé (par curiosité) s'il est possible de faire ce que j'essayais de faire. Le problème semble être lié à la définition du paramètre de sortie. Lorsque je supprime ce paramètre et le: theCount de la requête, il fonctionne comme un charme. – cbeuker

+0

Mise à jour avec une tentative de SELECT INTO – FerranB

+0

Oui, en ajoutant le début et la fin l'a fait, cela fonctionne maintenant et je peux obtenir la valeur en tant que paramètre de sortie. Je vous remercie.. – cbeuker

0

Je pense le problème est que vous avez un espace de fin dans le nom du paramètre pour parameterTheCount.

Modifier

retirer maintenant les noms des colons de paramètres dans le constructeur à OracleParameter.

+0

Désolé, c'était une faute de frappe de ma part .. – cbeuker

+0

@cbeuker J'ai mis à jour ma réponse –

+0

Essayé, pas d'effet. Comme je l'ai mentionné dans le commentaire à FerranB. Le problème est avec la définition du paramètre de sortie: theCount. – cbeuker

Questions connexes