2008-12-11 8 views
0

Eh bien, j'interroge ma base de données, une table appelée bookBilling, pour obtenir une valeur sous la colonne de billingID.Classic ASP Erreur de base de données

Dans ma première requête, j'obtiens l'identifiant client d'une table en fonction de la valeur que le cookie contient. Dans ma deuxième requête, je prends cette valeur custID et je cherche à obtenir l'ID de facturation associé.

query = "SELECT custID FROM bookSession WHERE session='"&theCookie&"'" 
'--Connect to DB' 
Set objConn = ConnectDB() 
'--Query to DB' 
Set objRS = objConn.Execute(query) 
custID = objRS.Fields("custID") 

    query = "SELECT billingID FROM bookBilling WHERE custID="&custID&"" 
    objConn.Execute(query) 

Voici où cela devient un problème. J'ai essayé d'utiliser cette option pour obtenir la valeur:

billingID = objRS.Fields("billingID") 

Quand cela ne fonctionne pas, j'imprimé la requête de mon navigateur pour vous assurer qu'il a travaillé et il est revenu bien, je l'ai vérifié dans SQL Server Management Studio pour faire sûr. Après cela, j'ai décidé de jouer avec un peu et j'ai trouvé que l'utilisation de "0" comme référence fonctionne puisque c'est le premier élément de ma table. Donc, cela a fonctionné, je sais que mon en-tête de colonne de table est correct, je l'ai regardé et utilisé dans d'autres requêtes avant. Est-ce que quelqu'un sait pourquoi cela pourrait arriver? Est-ce le résultat de ne pas effacer ma connexion ou de la fermer après?

Merci

Répondre

2

Hé, est-ce une faute de frappe que vous n'avez pas?

query = "SELECT BILLINGID DE bookBilling OU custID =" & custID & ""

objRS = objConn.Execute (requête)

Pour recharger les enregistrements avec la données et définition de la deuxième requête .....

Juste une pensée, essayez Setting/Insta ntiating les objRS à un premier Recordset, puis appliquer le query.execute à après, plutôt que toutes les opérations initiales en un avec la première requête CustId

2

L'exécution de deux requêtes distinctes est lente malgré tout. Il est presque toujours plus rapide de les combiner en une seule déclaration:

SELECT billingID 
FROM bookBilling bb 
INNER JOIN bookSession bs ON bs.custID=bb.custID 
WHERE bs.session= @theCookie 

également: les cookies sont de simples fichiers textes, et tout le monde peut éditer un fichier texte. Si vous substituez une valeur de cookie directement dans votre requête, il y a un risque d'injection SQL. Ce n'est pas le vecteur d'attaque normal, mais c'est toujours possible.

Quant à votre erreur spécifique, vous exécutez la 2ème requête directement à partir de la connexion plutôt que de l'ouvrir dans le jeu d'enregistrements:

objConn.Execute(query) 

Je suis surpris que vous obtenez quoi que ce soit, et j'attends la valeur vous voyez dans objRS.Fields(0) est probablement juste le custID de la requête précédente. Mais tout cela devient discutable si vous consolidez les requêtes comme je l'ai recommandé.

0
query = "SELECT billingID FROM bookBilling WHERE custID="&custID&"" 
objConn.Execute(query) 

Vous n'êtes pas l'ouverture d'une resordset pour cette seconde requête. Et, je ne sais pas si cela a une quelconque influence, mais je ne nomme jamais mes requêtes identiques. Pour être sûr que je devine. Edit, c'est un peu ce que les gens au-dessus de moi ont dit, je suis un Slowpoke.

0

Merde, oui c'était une faute de frappe. Je ne suis pas sûr de comprendre pourquoi cela fonctionne en utilisant le numéro de colonne mais pas le nom de la colonne même si je n'ai pas ouvert le jeu d'enregistrements.

@Joel Coehoorn Merci pour les informations sur l'intérieur rejoignant les requêtes. Mon professeur nous a dit de le faire mais je ne l'ai pas vraiment compris suffisamment pour le faire jusqu'à ce que je le voie.

Pour ma table je ne peux pas vraiment l'utiliser cependant parce qu'il n'y a pas nécessairement un ID de facturation lors de l'inscription ainsi je rencontrerais quelques "EOF" occasionnellement.

Merci à tous!

+0

Si vous utilisez un programme comme Access pour vos bases de données, vous pouvez laisser écrire vos requêtes SELECT pour vous, ce qui est très facile quand il s'agit d'un grand nombre de jointures. :) – Kablam

+0

Je ne vois pas comment le manque d'un ID de facturation a quelque chose à voir avec cela. Dans ce cas, vous devez toujours gérer un EOF dans votre code existant. Si cela vous concerne vraiment, utilisez une jointure gauche plutôt qu'une jointure interne et utilisez la fonction SQL Coalesce() pour gérer le résultat NULL. –

Questions connexes