2011-06-16 7 views
3

Je souhaite simplement récupérer un seul enregistrement d'une base de données dans une page ASP classique. Le code ci-dessous fonctionne essentiellement, mais il y a quelques problèmes que j'ai besoin d'aide pour résoudre:Requête simple avec ADO et ASP classique

1) Je veux voir si un enregistrement a été retourné ou non. result n'est pas Nothing, donc la redirection en bas n'est jamais effectuée. contact.RecordCount renvoie toujours -1, donc je ne peux apparemment pas utiliser cela non plus. Bizarrement, essayer d'accéder à RecordCount en dehors de la fonction lance une erreur "L'objet ne supporte pas cette propriété ou méthode: 'RecordCount'".

2) J'ai lu des requêtes déconnectées et j'ai vu des exemples où la connexion et la commande sont fermées et/ou définies sur Nothing à la fin de la fonction. Existe-t-il une meilleure pratique définitive sur ce que je devrais faire?

3) L'utilisation d'une requête paramétrée me protège-t-elle complètement de l'injection SQL ou dois-je supprimer manuellement les mots et les caractères dangereux?

function GetContactByUsername(username) 
    Dim conn, command, param, contact 
    set conn = server.CreateObject("adodb.connection") 
    conn.Open Application("DatabaseConnectionString") 

    Set command = Server.CreateObject("ADODB.COMMAND") 
    set command.ActiveConnection = conn 
    command.CommandType = adCmdText 
    command.CommandText = "Select * from MY_DATABASE.dbo.Contact where Username = ?" 

    Set param = command.CreateParameter ("Username", adVarWChar, adParamInput, 50) 
    param.value = username 
    command.Parameters.Append param 

    Set contact = Server.CreateObject("ADODB.RECORDSET") 

    contact.Open command 

    Response.Write contact.RecordCount '' always -1 

    set GetContactByPurlCode = contact 
end function 

dim result 
result = GetContactByUsername(Request.QueryString("username")) 

if result is Nothing then  '' never true 
    Response.Redirect "/notfound.asp" 
end if 

FirstName = Trim(result("FirstName")) 
LastName = Trim(result("LastName ")) 

Répondre

6

1) Pour vérifier l'absence de registres, utilisez rs.EOF, non "est rien." L'objet RecordSet est toujours un objet. C'est juste que parfois il n'y a pas de lignes.

Si vous souhaitez utiliser RecordCount mais que vous obtenez -1, passez à un curseur côté client (adUseClient).

2) Pas de meilleure pratique ici, mais j'ai personnellement toujours fermé la connexion et la commande, et n'ai pas eu beaucoup de problèmes de performance. Les objets de connexion sont particulièrement précieux, alors fermez-les le plus tôt possible sur des pages à fort volume.

3) Oui, le paramétrage de votre variable est parfait, sauf si vous appelez une procédure stockée qui construit une requête dynamique. Au fait, vous devriez éviter "SELECT *" car cela vous obligera à retourner plus de données que nécessaire et un problème de maintenance est en train de se produire.