2009-05-06 9 views
3

J'ai une procédure stockée qui renvoie deux jeux d'enregistrements que j'appelle à l'aide de GetReader. Je répète le premier, appelle IDataReader.NextResult(), puis répète le second.Processus stocké Paramètre de sortie + Sélection du paramètre de sortie non renvoyé

J'attribue des valeurs aux paramètres de sortie dans le sp, mais lorsque je vérifie les valeurs après avoir terminé avec mon lecteur, mes paramètres de sortie sont NULL. On dirait un bug. Je ne veux pas utiliser un select car je n'aime pas les fudges. Quelques extraits ...

...

sp.Command.AddParameter("@SelectedTabID", selectedTabID, DbType.Int32); 
sp.Command.AddParameter("@CurrentTabID", 0, DbType.Int32, ParameterDirection.Output); 
sp.Command.AddParameter("@TypeID", 0, DbType.Int32, ParameterDirection.Output); 

(note le faire de cette façon ou en utilisant AddOutputParameter() donne même résultat)

...

using(IDataReader reader = sp.GetReader()) 
{ 
    while (reader.Read()) {...} 
    if (reader.NextResult()) {while (reader.Read()) {...}} 

} 

..

int one = (int)sp.OutputValues[0]; //null expected an int 
int two = (int)sp.OutputValues[1]; //null expected an int 

Looki ng avec impatience quelques joyaux de la sagesse :)

+0

Quels SGBDR, SQL Server, Oracle, DB2, MySQL,. . . ? –

+0

SQL Server 2005 avec Subsonic –

Répondre

0

Ce défaut est subsonique, fonctionne bien comme une tourbière norme SQLConnection/Commande

0

légèrement confus ici ... vous attendez la sortie des valeurs scalaires ou une sorte de recordset? Get Reader n'aurait vraiment de sens que si vous avez, par exemple, un certain curseur à revenir comme paramètre out ...

Vous pouvez appeler « ExecuteNonQuery() » de votre commande et vous assurer que vous définissez

+0

SP va: Sélectionnez @ p1 = somevalue, @ p2 = autreValeur De quelque part Sélectionnez a, b, c A partir de la requête 1 Où somevalue = @ p1 Sélectionnez x, y, z A partir de la requête 2 Où someothervalue = @ p2 ... Je veux des ensembles de résultats et les deux paramètres L'utilisation de InputOutput a permis de résoudre ce problème. –

4

correctement le CommandType (CommandType.StoredProcedure) La meilleure façon d'obtenir la Le paramètre de sortie consiste à utiliser une variable instanciée. Ce que je veux dire est de conserver une référence à vos paramètres, puis une fois que vous exécutez votre sproc, vous pouvez les inspecter comme ceci:

SqlCommand cmd = new SqlCommand(); 
cmd.Connection = ConfigurationManager.ConnectionStrings["MyCon"].ToString(); 
cmd.CommandText = "MySproc"; 

SqlParameter parmOut = new SqlParameter("@StuffIWant", SqlDbType.Int); 
parmOut.Direction=ParameterDirection.Output; 

cmd.Parameters.Add(parmOut); 
cmd.ExecuteNonQuery(); 

string theThingIWant = parmOut.Value.ToString(); 

Cela peut ne pas être en utilisant un datareader, mais vous pourrez peut-être utiliser pour trouver la bonne réponse. Bonne chance.

0

La réponse est que vous devez fermer le lecteur avant de pouvoir accéder aux paramètres de sortie.

De: This Page

  • Assurez-vous de récupérer le jeu d'enregistrements d'abord comme SqlDataReader via Process cmd.ExecuteReader() par tous recordsets puis ...
  • Assurez-vous que vous fermez la recordset, ou SqlDataReader via reader.Close() avant d'essayer de récupérer les paramètres de sortie
Questions connexes