Umgang mit ADODB-connections-in classic ASP
Ich bin ein ASP.NET C# - Typ, der zurück zum klassischen ASP, und brauche etwas Hilfe.
Ersten, Blick auf diese beiden Funktionen (ich weiß, in VBScript, sind die Kommentare erklärt '
und nicht durch //
aber der syntax-highlighter hier vermasselt mit '
).
Erste 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
Zweite 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
Nun, beginnen wir mit den Fragen:
Frage #1:
Was das beste ist,
Connection.Open "blah blah blah"
Command.CommandText = "blah blah blah"
Recordset.Open Command, Connection
oder
Connection.Open "blah blah blah"
Command.ActiveConnection = Connection
Command.CommandText = "blah blah blah"
Set Recordset = Command.Execute
?
Frage #2:
Wenn dabei Wählt sollte ich disconnected recordsets wie
Set Recordset = Command.Execute
Command.ActiveConnection = Nothing
Connection.Close
Set Connection = Nothing
?
Frage #3:
Muss ich anrufen
Recordset.Close
Connection.Close
obwohl ich
Set Recordset = Nothing
Set Command = Nothing
Set Connection = Nothing
rechts unten (d.h. der garbage collector aufgerufen, wenn von der Set Stuff= Nothing
auch .Close
Sie vor der Zerstörung)?
Frage #4:
Muss ich gehören die
Recordset.Close
Connection.Close
Set Recordset = Nothing
Set Command = Nothing
Set Connection = Nothing
Zeug, obwohl die Funktion dort endet, und diese Objekte außerhalb des Gültigkeitsbereichs und der garbage collector (sollten) kümmert sich um Sie?
Frage #5:
Tun, classic ASP zusammengefasste Verbindung, so kann ich Sie öffnen und schließen Sie mit jedem Befehl, oder sollte ich passiere ein gemeinsames connection-Objekt um?
Vielen Dank im Voraus für Eure Hilfe, Andrea.
InformationsquelleAutor Albireo | 2010-09-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Frage #1.
Beide.
Es hängt davon ab, ob Sie möchten, dass alle Parameter
Recordset.Open
hat, und auch auf Ihre persönlichen Vorlieben.Frage #2.
Können Sie, aber es spielt keine Rolle. Es wird kaum einen Unterschied machen-Ihr Befehl ausgeführt wurde, und, wenn das connection-Objekt geöffnet wird, werden alle sperren, und Sachen, die sind freigegeben auf dem server.
Frage #3.
Gibt es keinen garbage collector in VBScript, da ist reference counting.
Ein Objekt zerstört wird, mit all seinen Finalizer aufgerufen, wenn es keine weiteren Verweise.
Im Falle der zusammengefassten verbindungen, die einen Unterschied machen kann-da der server behält eine Referenz auf die Verbindung, wird die variable auf
Nothing
kann nichts tun, eigentlich, da Referenz-Zähler nicht null erreichen (und Sie nicht haben, um es zuNothing
sowieso, es erfolgt automatisch beim verlassen der Funktion).Wenn die server nicht gehen, zu bündeln, um die Verbindung, es wird wahrscheinlich nicht haben einen Hinweis darauf, an welcher Stelle wird die variable auf
Nothing
(explizit oder implizit) auch die Verbindung schließen.Meine persönliche Präferenz ist hier zu nennen
Close
, so dass ich weiß, wo mein Zeug ist, aber nicht die Variablen, umNothing
. Das wird gut funktionieren, auf zusammengefasste und nicht zusammengefasste verbindungen.Frage #4.
Siehe Frage 3.
Frage #5.
In einer web-Umgebung, die Sie immer wollen, öffnen Sie ein neues Connection-Objekt, wenn Sie es brauchen, mit Ausnahme der Fälle, wenn mehrere Methoden von Ihnen müssen Ihren bits die innerhalb der gleichen Transaktion.
Wrt Antwort auf Q2 dies hängt von der cursor, die Sie verwenden, wenn Sie einen cursor, der Ihnen erlaubt, sich vorwärts und rückwärts durch das recordset dann die Verbindung muss offen bleiben, oder du wirst ein ADODB-Fehler, wenn Sie versuchen, rückwärts zu gehen. In der Erwägung, dass, wenn Sie brauchen nur vorwärts, nur die navigation durch die Ergebnisse fließen dann in ein getrenntes recordset sparen Ressourcen
In der Wie Neu Diese Tests - Abschnitt in Cheran ' s link sagt es
cn(x).close 'comment this line out to recreate the problem
, aber GSerg sagt, dass dieSet cn(x) = Nothing
Zeile sollte ausreichen, denn er fordertConnection.Close
. Welche ist die richtige?Sofern der server behält eine Referenz auf die Verbindung, die Verknüpfung ist richtig und ich bin falsch. Jedoch "Verbindungen, die Verwendung des Jet OLE DB-Provider und ODBC-Treiber sind nicht gepoolt", so dass in der Praxis habe ich richtig bin. Ich ändere meine Antwort, danke für den Hinweis.
InformationsquelleAutor GSerg