2009-09-18 7 views
1

J'ai hérité d'une fonction dans une application ASP.NET (C#) où l'auteur utilisait le Microsoft.Practices.EnterpriseLibrary.Data library, mais il m'a été demandé de le modifier afin qu'il utilise System.Data.OracleClient. Cette fonction utilise une procédure stockée dans une base de données. itemName et openDate sont des paramètres de chaîne pris en charge par la fonction. PKG_AUCTION_ITEMS.IsAuctionItem est le nom de la fonction de procédure stockée.Conversion de l'objet DbCommand en objet OracleCommand

Voici le code que j'ai reçu:

string result = String.Empty; 

    Database db = DatabaseFactory.CreateDatabase("OraData"); 
    using (DbCommand cmdDB = db.GetStoredProcCommand("PKG_AUCTION_ITEMS.IsAuctionItem")) 
    { 
     db.AddInParameter(cmdDB, "vItemName", DbType.String, itemName); 
     db.AddInParameter(cmdDB, "vOpenDate", DbType.String, openDate); 
     db.AddParameter(cmdDB, "ret", DbType.String, 2, ParameterDirection.ReturnValue, false, 0, 0, null, DataRowVersion.Current, null); 


     db.ExecuteNonQuery(cmdDB); 
     result = cmdDB.Parameters["ret"].Value.ToString(); 
    } 

Voici mon code :(connstr est la chaîne de connexion)

string result = String.Empty; 
    OracleConnection conn = new OracleConnection(connstr); 
    OracleCommand cmd = new OracleCommand("PKG_AUCTION_ITEMS.IsAuctionItem",conn); 
    myCmd.CommandType = CommandType.StoredProcedure; 

    using (myCmd) 
    { 
     myCmd.Parameters.AddWithValue("vItemName", itemName); 
     myCmd.Parameters.AddWithValue("vOpenDate", openDate); 
     myCmd.Parameters.AddWithValue("ret", ???); 
     myCmd.ExecuteNonQuery(); 
     result = myCmd.Parameters["ret"].Value.ToString(); 
    } 

Je ne comprends pas ce que la différence entre AddInParameter et AddParameter est , et ce que cette ligne fait:

db.AddParameter(cmdDB, "ret", DbType.String, 2, ParameterDirection.ReturnValue, false, 0, 0, null, DataRowVersion.Current, null); 

Suis-je sur la droite tr Ack? quelqu'un peut-il aider s'il vous plait? Merci

+0

Pourquoi avez-vous demandé de le changer? Vous devriez avoir pu modifier le fichier de configuration pour utiliser Oracle. – CAbbott

+0

La bibliothèque Microsoft.Practice n'étant pas une bibliothèque standard utilisée ici, le moteur de génération ne l'a pas. Pour cette raison, le projet ne peut pas être construit sur le serveur. – zohair

+0

Vous devez probablement installer Enterprise Library sur votre serveur Web pour le faire fonctionner. – Juri

Répondre

1

db.AddParameter ajoute un paramètre de sortie dans ce cas. Vous devez indiquer à la bibliothèque du client db que vous souhaitez récupérer la valeur de retour de l'appel sproc. D'où l'appel à AddParameter. db.AddInParameter ajoute un paramètre qui n'est qu'un paramètre interne. Dans le It est un raccourci pour db.AddParameter en utilisant ParameterDirection.Input. Voir http://blogs.x2line.com/al/archive/2006/03/25/1579.aspx pour une discussion sur AddInParameter vs. AddParameter.

De même, en utilisant OracleClient, AddWithValue est comme AddInParameter - un raccourci à utiliser pour les paramètres d'entrée lorsque vous connaissez déjà la valeur. Puisque la valeur de retour est, par définition, un paramètre de sortie, vous ne pouvez pas utiliser AddWithValue. Vous devez utiliser Parameters.Add() à la place.

Maintenant, revenons à votre question principale: quel est le code équivalent utilisant OracleClient. Il est quelque chose comme ceci:

string result = String.Empty; 
OracleConnection conn = new OracleConnection(connstr); 
OracleCommand cmd = new OracleCommand("PKG_AUCTION_ITEMS.IsAuctionItem",conn); 
myCmd.CommandType = CommandType.StoredProcedure; 

using (myCmd) 
{ 
    myCmd.Parameters.AddWithValue("vItemName", itemName); 
    myCmd.Parameters.AddWithValue("vOpenDate", openDate); 

    // depending on whether you're using Microsoft's or Oracle's ODP, you 
    // may need to use OracleType.Varchar instead of OracleDbType.Varchar2. 
    // See http://forums.asp.net/t/1002097.aspx for more details. 
    OracleParameter retval = new OracleParameter("ret",OracleDbType.Varchar2,2); 
    retval.Direction = ParameterDirection.ReturnValue; 
    myCmd.Parameters.Add(retval); 

    myCmd.ExecuteNonQuery(); 
    result = myCmd.Parameters["ret"].Value.ToString(); 
} 
+0

Alors, quel serait l'équivalent de 'AddInParameter' si j'utilise' OracleClient'? – zohair

+0

Je créer le paramètre séparément, définir ParameterDirection.ReturnValue, puis utiliser Parameters.Add(). Voir ci-dessus-- J'ai édité la réponse pour montrer un échantillon de code. –

+0

Merci! Cela fonctionne parfaitement! – zohair

0

Nous faisons réellement la configuration des paramètres plus explicitement, quelque chose comme ça

System.Data.OracleClient.OracleCommand command = new System.Data.OracleClient.OracleCommand("PACKAGE_NAME.STORED_NAME"); 
command.CommandType = System.Data.CommandType.StoredProcedure; 

System.Data.OracleClient.OracleParameter param; 
param = new System.Data.OracleClient.OracleParameter("PARAM_NAME_ID", System.Data.OracleClient.OracleType.Number); 
param.Value = id; 
command.Parameters.Add(param); 

param = new System.Data.OracleClient.OracleParameter("PARAM_NAME_RETURN_COUNT", System.Data.OracleClient.OracleType.Number); 
param.Direction = System.Data.ParameterDirection.Output; 
command.Parameters.Add(param); 
... 

Vous voyez, il y a une direction de la propriété que nous attribuons explicitement le paramètre qui est être retourné. Le premier obtient la valeur d'une variable "id" et est un paramètre qui est passé à la procédure stockée.

Le 2ème est retourné par la procédure stockée, donc pas de valeur est affectée à cette valeur de paramètre et la direction est réglé sur "System.Data.ParameterDirection.Output"