2009-07-16 10 views
5

Je travaille actuellement sur un projet ASP classique en train de dialoguer avec une base de données Oracle. J'essaie de trouver un moyen d'appeler en toute sécurité un script Oracle PL/SQL et de passer des paramètres avec ADO. La solution actuellement construit le script SQL manuellement avec des variables intégrées comme ceci:Appel d'une requête Oracle paramétrée depuis ADODB dans Classic ASP

strSQL = "SELECT field1, etc FROM my_table WHERE (field = '" & filter_value & "')" 

Ceci, bien sûr, est laid et peu sûr, et à des abus.

Le code que j'ai jusqu'à présent (déroba à partir de divers sites Web basés non asp classique) ressemble à ceci:

dim strSQL, oConn, oCommand, oParam 
set oConn = server.createobject("ADODB.Connection") 
oConn.Open myConnString 

strSQL = "SELECT field1, etc FROM my_table WHERE (field = :filter_field)" 

dim oFilteredList 
set oFilteredList = Server.CreateObject("ADODB.Command") 
oFilteredList.ActiveConnection = oConn 
oFilteredList.CommandText = strSQL 
oFilteredList.CommandType = adCmdText 
oFilteredList.NamedParameters = True 

set oParam = oFilteredList.CreateParameter("filter_field", adVarChar, adParamInput, 10, filter_value) 
oFilteredList.Parameters.Append oParam 

set rsResults = oFilteredList.Execute 

Cela provoque l'erreur « objet de paramètre est mal défini. Des informations incohérentes ou incomplètes ont été fournies "

Quelle est la méthode correcte d'appeler Oracle/PL/SQL avec des paramètres nommés d'ADO? J'ai besoin d'utiliser des paramètres nommés car le code SQL réel est un peu plus complexe, et différents paramètres sont utilisés plusieurs fois dans la commande SQL.

+0

Essayez de commenter la ligne avec NamedParameters = True et voyez si cela aide. – shahkalpesh

+0

utilisez-vous Option Explicit et avez-vous inclus une sorte de fichier adovbs.inc pour vos constantes "ad"? – Funka

+0

Oui, j'ai essayé avec et sans la propriété NamedParameters, et j'inclus adovbs.inc. J'utilise toujours l'option explicite – Buzzrick

Répondre

2

Comment avez-vous défini filter_value? Si ce n'est pas déclaré comme une chaîne ou si vous avez attribué une chaîne de plus de 10 caractères (comme vous l'avez indiqué lors de la création du paramètre), vous aurez des problèmes avec cela.

De plus (et en partie pour ma propre référence), paramètres nommés ne sont pas pris en charge par OraOLEDB (à savoir ADODB).

Voir Oracle® Provider for OLE DB Developer's Guide 11g Release 1 (11.1) ou suivez la rubrique "Paramètres de commande" lien sur l'un des previous versions (8iR3, 9i, 9iR2, 10g, 10gR2):

Commande Paramètres

Lorsque vous utilisez Oracle ANSI SQL, les paramètres dans le texte de la commande sont précédés d'un deux-points . Dans ODBC SQL, les paramètres sont indiqués par un point d'interrogation (?).

OraOLEDB prend en charge l'entrée, de sortie et paramètres d'entrée et de sortie pour PL/SQL procédures stockées et stockées fonctions. OraOLEDB prend en charge les paramètres d'entrée pour les instructions SQL.

"Note: OraOLEDB ne prend en charge que la liaison positionnelle ."

Cela dit, cela ne devrait avoir aucune incidence sur votre requête lorsque vous utilisez OraOLEDB:

oFilteredList.NamedParameters = True 

J'ai eu du succès des requêtes en cours d'exécution exactement comme le reste de votre exemple montre bien que sur Oracle 10gR2.

Vous ne montrez pas votre chaîne de connexion, donc je dois supposer que c'est valide. Le comportement peut différer en fonction des options, donc voici ce que j'utilise avec succès:

`"Provider=OraOLEDB.Oracle;Data Source=TNSNAMES_ENTRY;User ID=XXXX;Password=YYYY;DistribTx=0;"`