2010-11-28 46 views
1

Je travaille sur un petit projet pour l'entreprise locale et le code suivant fonctionne bien sur ma machine, mais il génère des erreurs sur leur serveur. Actuellement, je n'ai pas accès à ce serveur, et ce n'est pas un domaine que je connais beaucoup, donc je dois vous demander les gars.Quand fermer le jeu de résultats (question ODBC de base)

La page est écrite en ASP classique (javascript pour les scripts). La logique va comme ceci:

conn.Open("myconnection"); 
bigQuery = "..."; 
rs = conn.execute(bigQuery); 
while (!rs.eof) { 
    ... 
    smallQuery = "..." 
    rssmall = conn.execute(smallQuery); 
    ... 
    rssmall.close(); 
    ... 
    rs.movenext(); 
} 
rs.close(); 
conn.close(); 

Comme je l'ai dit cela va bien sur ma machine, mais il retourne une erreur (la pire chose est que je ne sais même pas quelle erreur) sur le serveur de la société si BigQuery renvoie plus de ~ 20 lignes. Y a-t-il quelque chose qui ne va pas dans mon code (ce n'est pas vraiment mon domaine, mais je suppose qu'il est correct de rassembler des données dans la boucle comme ça?), Ou quelque chose ne va pas avec leur serveur IIS.

Merci.

edit: Plus d'info: Base de données Access. Tout est assez standard:

conn=Server.CreateObject("ADODB.Connection"); 
conn.Provider="Microsoft.Jet.OLEDB.4.0"; 
conn.Open("D:/db/testingDb.mdb"); 

Les requêtes sont un peu longues, donc je ne les publierai pas. Ce sont des sélections tout à fait ordinaires donc ce n'est pas le problème.

+1

Votre logique de base semble bien, et le fait qu'il exécute sur votre machine locale laisse deviner qu'il est peut-être un problème de configuration sur la machine cliente, mais plus d'informations serait utile. Quelle base de données utilisez-vous? À quoi ressemble votre chaîne de connexion? À quoi ressemblent les instructions SELECT? Et ils vont devoir vous dire quel est le message d'erreur! (Beaucoup de clients ne réalisent pas que les développeurs de logiciels ne * lisent * pas * les pensées à distance ;-). –

+0

Ok, merci. J'avais seulement besoin d'une confirmation que la logique de base est bonne. J'ai mis à jour la question, mais je suis presque sûr qu'ils ont réussi à renverser le café sur le serveur ou quelque chose comme ça :) – Klark

Répondre

2

J'avais une ancienne application ASP classique dont j'ai hérité qui était très similaire (grosses requêtes avec d'autres requêtes exécutées dans la boucle récupérant les résultats de la première requête) jusqu'à quarante enregistrements ou plus ont été retournés. La façon dont j'ai "résolu" le problème consistait à instancier un autre objet de connexion pour exécuter l'autre requête. Donc, en utilisant votre pseudo code, essayez -

conn.Open("myconnection"); 
conn2.Open("myconnection") 

bigQuery = "..."; 
rs = conn.execute(bigQuery); 
while (!rs.eof) { 
    ... 
    smallQuery = "..." 
    rssmall = conn2.execute(smallQuery); 
    ... 
    rssmall.close(); 
    ... 
    rs.movenext(); 
} 
rs.close(); 
conn2.close(); 
conn.close(); 
+1

Oui, cela a résolu le problème. Étrange. Est-ce que quelqu'un sait pourquoi cela se passe-t-il? Est-ce le cas avec toutes les connexions ADODB, ou seulement avec ASP classique? Merci beaucoup. Tu m'as sauvé beaucoup de temps. – Klark

2

Quel serveur fonctionnent-ils réellement? La plupart des nouvelles versions de Windows Server ne sont pas fournies avec le pilote Jet 4.0 pour 64 bits, donc vous ne pouvez pas utiliser une base de données d'accès avec ce pilote si votre application fonctionne comme une application 64 bits. Vous pouvez essayer d'exécuter en 32 bits ce qui pourrait résoudre le problème.

Il y a un alternative driver emballé comme un composant de bureau qui peut être une option.

Essayez d'écrire une page de test simple qui ouvre littéralement et ferme la connexion de base de données comme ceci:

<% 
Dim conn 
Set conn = Server.CreateObject("ADODB.Connection") 
conn.Provider = "Microsoft.Jet.OLEDB.4.0" 
conn.Open("D:/db/testingDb.mdb") 

Response.Write("Database Opened OK") 

conn.Close() 

%> 

exécuter sur le serveur de production et si vous voyez Database Opened OK alors vous saurez qu'il est certainement la requête plutôt que la base de données à l'origine du problème.

Si vous obtenez une erreur en essayant d'ouvrir la base de données alors vous devez changer d'utiliser le nouveau pilote ou d'essayer l'application en mode 32 bits

Dans le cas où il est la requête cause du problème, alors il peut soit que vous aurez besoin d'utiliser les différents arguments supplémentaires de la méthode Open() pour essayer d'utiliser un autre curseur (uniquement si vous n'avez besoin que de parcourir une fois les résultats), ce qui changera la façon dont ADODB récupère les données lié à la requête.

Modifier

Si vous voulez essayer le débogage du code un peu plus ajouter ce qui suit au début du fichier.Cela provoque le processeur de script ASP pour continuer même si elle frappe une erreur

On Error Resume Next 

ensuite à des intervalles dans le fichier où vous attendez une erreur qui aurait pu arriver faire

If Err <> 0 Then 
    Response.Write(Err.Number & " - " & Err.Description) 
End If 

Voir this article à partir d'ASP 101 pour les bases du traitement des erreurs dans ASP et VBScript

+0

Merci pour votre réponse. L'ouverture de la connexion n'est pas le problème. Comme je l'ai dit dans ma question, tout fonctionne correctement jusqu'à ce qu'il y ait plus de 20 entrées dans la base de données. Je ne suis pas sûr quel genre de l'erreur est liée au nombre des entrées retournées d'une requête? Je sais que c'est une question très déroutante parce que je ne peux même pas fournir de description d'erreur. Je vais y aller demain et vous en dire plus sur le problème s'il existe encore (je suppose qu'un redémarrage de l'IIS fera l'affaire :)) – Klark

+0

@Klark: Ctrl-Alt-Del est souvent une bonne première chose à essayer lors du débogage des problèmes comme celui-ci. –

+0

Ajout d'un code que vous pouvez ajouter pour obtenir des messages d'erreur significatifs avec votre code – RobV