2009-08-07 6 views
3

J'ai une requête dans une page ASP. Le jeu d'enregistrements que j'obéis doit être imprimé dans 3 tables différentes, après quelques conditions. Donc, pour éviter d'exécuter 3 fois presque la même requête, j'ai décidé de rechercher dans le jeu d'enregistrements les résultats dont j'ai besoin ... donc j'ai besoin de faire un RS.MoveFirst deux fois. Mais ... lorsque j'ai analysé avec SQL Profiler, j'ai vu que l'opération MoveFirst ré-exécute ma requête ... exactement ce que je voulais éviter. Comment puis-je mettre en cache les résultats et seulement déplacer le jeu d'enregistrements?Comment éviter de réexécuter la requête sur un MoveFirst

+0

instantané ou données dynamiques configurés? Est-ce que dbSeeChanges est utilisé? –

+0

forwardonly (la valeur par défaut) Obs: Je n'ai pas besoin d'obtenir les modifications après la première exécution de la requête – Roxana

Répondre

2

Utilisez un recordset déconnecté

Const adOpenStatic = 3 
Const adUseClient = 3 
Const adLockOptimistic = 3 

Dim conn: Set conn = Server.CreateObject("ADODB.Connection") 
conn.Open sYourConnectionString 

Dim rs : Set rs = Server.CreateObject("ADODB.Recordset") 
rs.CursorLocation = adUseClient 

rs.Open sYourSQL, conn, adOpenStatic, adLockOptimistic 

Set rs.ActiveConnection = Nothing 
conn.close 

'' // You can now roam around the recordset with .MoveFirst, .MoveNext etc without 
'' // incurring any further hits on the DB. 

de Notez que si vous avez des paramètres à fournir à votre sql, vous aurez besoin d'utiliser un objet ADODB.Command entre la connexion et recordset (ne soyez pas tentés d'utiliser la concaténation de chaîne) . Le principe est toujours le même: utilisez un emplacement de curseur client et un jeu d'enregistrements statique, puis détachez et fermez la connexion.

+0

'' 'adOpenStatic = 3''' Utilise un curseur statique. ** Une copie statique d'un ensemble d'enregistrements ** que vous pouvez utiliser pour rechercher des données ou générer des rapports. Les ajouts, modifications ou suppressions effectués par d'autres utilisateurs ne sont pas visibles. https://msdn.microsoft.com/fr-fr/library/ee252445(v=bts.10).aspx –

1

Personnellement, je voudrais simplement utiliser rs.getRows() et de naviguer dans le tableau ... non seulement sont u que u ne vous a frappé à nouveau la base de données devrait voir un énorme gain de performance à chaque fois que vous l'utilisez

Questions connexes