2016-04-19 11 views
2

Was ist der Unterschied zwischen würde ich mag esWarum und wann verwende ich das New-Schlüsselwort beim Deklarieren eines neuen Recordsets in Access VBA?

Dim rs as New adodb.recordset 

und

Dim rs as adodb.recordset 

In welchen Situationen die neue Anweisung verwenden oder nicht verwenden? Für den Kontext arbeite ich an einer ADODB-Zugriffsanwendung, die eine Verbindung zu einem SQL Server-Back-End herstellt.

+2

Mögliche Duplikat [? Was ist das Schlüsselwort 'Neu' in VBA tun] (http://stackoverflow.com/questions/21652671/what-does-the -keyword-new-do-in-vba) –

+0

@ Mat'sMug Diese Frage betrifft Microsoft Access und Recordsets, die sich von http://stackoverflow.com/questions/21652671/what-does-the-keyword- unterscheidet. new-do-in-vba –

+0

Ich habe eine Notiz hinzugefügt, die spezifisch für 'ADODB.Recordset' ist. –

Antwort

3

Das Schlüsselwort New erstellt eine neue Instanz eines Objekts, hier vom Typ ADODB.Recordset.

Eine Objektvariable benötigt eine Referenz haben, bevor sie zugegriffen werden kann, so ist dies:

Dim rs As ADODB.Recordset 
rs.Open "SELECT * FROM TableName" 

... wird zur Laufzeit mit Fehler # 91 sprengen - „Objekt oder mit Block Variable nicht gesetzt ". Der wichtige Teil dieser Nachricht ist hier "nicht gesetzt".

Wenn Sie das tun:

Dim rs As New ADODB.Recordset 

Sie wirklich tun:

Dim rs As ADODB.Recordset 
Set rs = New ADODB.Recordset 

Das Set Schlüsselwort verwendet wird, eine Referenz zuweisen einer Objektvariablen.


Insbesondere über ADODB.Recordset, würde ich sagen Sie nicht in der Regel ein Cord-New wollen. Stattdessen erhalten Sie eins durch Ausführen eines parametrisierten ADODB.Command (z. B. wenn ein Befehl eine SELECT Anweisung ausführt, erhalten Sie ein Recordset Ergebnis).


Ich würde davon abraten, die As New Verknüpfung im Anwendungsbereich der Prozedur zu verwenden. Vor allem, weil dies:

Private Sub Test() 
    Dim c As New Collection 
    c.Add "Test" 
    Set c = Nothing 
    Debug.Print c.Count 'what happens here? 
End Sub 

Wenn Sie den obigen Code ausdenken bläst, weil c nicht „gesetzt“ mehr ist, wenn c.Count zugegriffen wird, hast du gebissen.

Dieser Code verhält sich wie erwartet:

Private Sub Test() 
    Dim c As Collection 
    Set c = New Collection 
    c.Add "Test" 
    Set c = Nothing 
    Debug.Print c.Count 'what happens here? that's right, boom! 
End Sub