La manipulation ADODB connexions en ASP classique
Je suis un ASP.NET C# gars qui a de l'ASP classique, et a besoin d'aide avec elle.
Premier coup d'oeil, ce sont les deux fonctions (je sais en VBScript les commentaires sont déclarées par '
et non par //
mais la syntaxe surligneur ici mess avec '
).
Première version:
Function DoThing
Dim Connection, Command, Recordset
Set Connection = Server.CreateObject("ADODB.Connection")
Set Command = Server.CreateObject("ADODB.Command")
Set Recordset = Server.CreateObject("ADODB.Recordset")
Connection.Open "blah blah blah"
Command.CommandText = "blah blah blah"
Recordset.Open Command, Connection
If Recordset.EOF = False Then
While Recordset.EOF = False Then
// Do stuff.
Recordset.MoveNext
WEnd
Else
// Handle error.
End If
Recordset.Close
Connection.Close
Set Recordset = Nothing
Set Command = Nothing
Set Connection = Nothing
End Function
Deuxième version:
Function DoAnotherThing
Dim Connection, Command, Recordset
Set Connection = Server.CreateObject("ADODB.Connection")
Set Command = Server.CreateObject("ADODB.Command")
Connection.Open "blah blah blah"
Command.ActiveConnection = Connection
Command.CommandText = "blah blah blah"
Set Recordset = Command.Execute
If Recordset.EOF = False Then
While Recordset.EOF = False Then
// Do stuff.
Recordset.MoveNext
WEnd
Else
// Handle error.
End If
Recordset.Close
Connection.Close
Set Recordset = Nothing
Set Command = Nothing
Set Connection = Nothing
End Function
Maintenant, nous allons commencer avec les questions:
Question #1:
Ce qui est le mieux,
Connection.Open "blah blah blah"
Command.CommandText = "blah blah blah"
Recordset.Open Command, Connection
ou
Connection.Open "blah blah blah"
Command.ActiveConnection = Connection
Command.CommandText = "blah blah blah"
Set Recordset = Command.Execute
?
Question #2:
Lors Sélectionne dois-je utiliser déconnectés comme
Set Recordset = Command.Execute
Command.ActiveConnection = Nothing
Connection.Close
Set Connection = Nothing
?
La Question n ° 3:
Dois-je appeler
Recordset.Close
Connection.Close
même si je ne
Set Recordset = Nothing
Set Command = Nothing
Set Connection = Nothing
juste en dessous (c'est à dire le garbage collector lorsqu'il est appelé par le Set Stuff= Nothing
aussi .Close
avant la destruction)?
La Question n ° 4:
Dois-je inclure le
Recordset.Close
Connection.Close
Set Recordset = Nothing
Set Command = Nothing
Set Connection = Nothing
des trucs même si la fonction s'arrête là, et que ces objets est hors de portée, et le garbage collector (devrait) prend soin d'eux?
La Question n ° 5:
Classique ASP ont mis en commun de connexion, afin que je puisse les ouvrir et les fermer avec chaque commande, ou devrais-je passer une commune de la connexion de l'objet autour de vous?
Merci d'avance pour votre aide, Andrea.
OriginalL'auteur Albireo | 2010-09-22
Vous devez vous connecter pour publier un commentaire.
Question #1.
À la fois.
Cela dépend si vous voulez que tous les paramètres
Recordset.Open
a, et aussi de vos préférences personnelles.Question n ° 2.
Vous pouvez, mais il n'a pas d'importance. Il sera difficile de faire une différence -- votre commande est terminée, et, bien que l'objet de connexion est ouverte, toutes les serrures et les choses sont publiées sur le serveur.
Question #3.
Il n'y a pas de garbage collector en VBScript, il y a de comptage de référence.
Un objet est détruit, avec toutes ses finaliseurs appelé, quand il n'y a plus de références.
En cas de mise en commun de connexions, qui peuvent faire une différence, parce que le serveur peut conserver une référence à la connexion, la définition de la variable à
Nothing
ne peut rien faire à cause de comptage de référence ne seront pas atteindre zéro (et vous n'avez pas à mettre àNothing
de toute façon, cela sera fait automatiquement lors de la sortie de la fonction).Si le serveur ne va pas à la piscine de la connexion, il ne sera probablement pas avoir une référence à elle, à quel point la définition de la variable à
Nothing
(explicitement ou implicitement) va également fermer la connexion.Ma préférence personnelle est, ici, d'appel
Close
, de sorte que je sais où sont mes affaires, mais aussi de ne pas définir les variables àNothing
. Qui fonctionnent très bien sur les deux collectifs et non collectifs connexions.La Question n ° 4.
Voir la question 3.
La Question n ° 5.
Dans un environnement web, vous voulez toujours ouvrir une nouvelle Connexion de l'objet lorsque vous en avez besoin, sauf pour le cas lorsque plusieurs méthodes de la vôtre doit faire de leurs morceaux dans la même transaction.
Wrt réponse à Q2 cela dépend du curseur que vous utilisez, si vous utilisez un curseur qui vous permet de vous déplacer vers l'avant et vers l'arrière à travers le jeu d'enregistrements, puis la connexion doit rester ouverte ou vous aurez une ADODB d'erreur si vous essayez de revenir en arrière. Alors que si vous n'avez besoin que de la navigation à travers les résultats alors un jeu d'enregistrements déconnecté permettra d'économiser des ressources
Dans le Comment Recréer Ces Tests section dans Cheran du lien il est dit
cn(x).close 'comment this line out to recreate the problem
, mais GSerg dit que leSet cn(x) = Nothing
ligne devrait suffire car il appelleConnection.Close
. Ce qui est juste?À condition que le serveur conserve une référence à la connexion, le lien est à droite et que je suis mal. Cependant, "les Connexions qui utilisent le Jet des fournisseurs OLE DB et ODBC pilotes ne sont pas mis en commun", donc, dans la pratique, je suis correct. Je vais modifier ma réponse, merci pour cette remarque.
OriginalL'auteur GSerg