2009-07-07 8 views
3

J'essaye d'écrire une requête paramétrée dans ASP Classic, et je commence à avoir l'impression de me battre la tête contre un mur. Je reçois l'erreur suivante:Paramètre ASP Classic nommé dans une requête paramétrée: Doit déclarer la variable scalaire

Must declare the scalar variable "@something".

Je jurerait c'est ce que la ligne de bonjour fait, mais peut-être je manque quelque chose ...

<% OPTION EXPLICIT %> 
<!-- #include file="../common/adovbs.inc" --> 
<% 

    Response.Buffer=false 

    dim conn,connectionString,cmd,sql,rs,parm 

    connectionString = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Data Source=.\sqlexpress;Initial Catalog=stuff" 
    set conn = server.CreateObject("adodb.connection") 
    conn.Open(connectionString) 

    set cmd = server.CreateObject("adodb.command") 
    set cmd.ActiveConnection = conn 
    cmd.CommandType = adCmdText 
    cmd.CommandText = "select @something" 
    cmd.NamedParameters = true 
    cmd.Prepared = true 
    set parm = cmd.CreateParameter("@something",advarchar,adParamInput,255,"Hello") 
    call cmd.Parameters.append(parm) 
    set rs = cmd.Execute 
    if not rs.eof then 
     Response.Write rs(0) 
    end if 


%> 

Répondre

3

ADO va attendre des points d'interrogation au lieu de noms de paramètres réels dans ce cas. Actuellement, le SQL "select @something" n'est pas paramétré: il voit le "@something" comme une variable SQL (non déclarée), pas comme un paramètre. Changez votre ligne CommandText à ceci:

cmd.CommandText = "select ?" 

Et je pense que vous obtiendrez le résultat que vous recherchez.

Bonne chance!

+0

Yip. J'ai réussi à bien faire les choses aussi. Mais j'aimerais vraiment que l'aspect nommé fonctionne, car il sera plus difficile de garder une trace de l'ordre des paramètres une fois que les requêtes ou les déclarations seront plus impliquées. –

+1

Après avoir essayé quelques variantes de cela, je n'ai pas été capable de trouver une solution non plus. Je suspecte que l'utilisation de paramètres nommés ne fonctionnera que si vous appelez une procédure stockée, sans envoyer de commande SQL. –

0

Je ne suis pas sûr de ce que votre requête est destinée à accomplir. Je ne suis pas sûr que les paramètres sont autorisés dans la liste de sélection. MSDN avait l'habitude d'avoir (il y a de nombreuses années, probablement) un article décent sur où les paramètres étaient autorisés dans une requête, mais je n'arrive pas à le trouver maintenant. OTTOMH, vos tentatives pour fournir les valeurs de paramètres à ADO semblent correctes. Est-ce que votre requête s'exécute si vous faites quelque chose comme ça?

SELECT 1 FROM sometable WHERE somefield = @something 
+0

Cela fonctionne correctement avec un point d'interrogation, donc le paramètre peut être dans la liste de sélection. Le problème est le même si je déplace le paramètre à la clause where. Le but de la requête est d'avoir l'exemple le plus court que je pourrais proposer aux autres pour bricoler. –

4

Voici un exemple de code d'un article MSDN Library sur la prévention des attaques par injection SQL. Je ne trouve pas l'URL d'origine, mais googler les mots-clés du titre (Prévenir les injections SQL dans ASP) devrait vous y parvenir assez rapidement. J'espère que cet exemple du monde réel aide.

strCmd = "select title, description from books where author_name = ?" 
Set objCommand.ActiveConnection = objConn 
objCommand.CommandText = strCmd 
objCommand.CommandType = adCmdText 
Set param1 = objCommand.CreateParameter ("author", adWChar, adParamInput, 50) 
param1.value = strAuthor 
objCommand.Parameters.Append param1 
Set objRS = objCommand.Execute() 

Voir la page suivante sur MSDN, près du bas, en se référant spécifiquement aux paramètres nommés.

MSDN example

+2

Merci. Est-il possible de le faire avec des paramètres nommés? –

+0

Voir la mise à jour que j'ai posté à la réponse. –

3
with server.createobject("adodb.command") 
    .activeConnection = application("connection_string") 
    .commandText = "update sometable set some_col=? where id=?" 
    .execute , array(some_value, the_id) 
end with