2016-04-28 7 views
0

データベースへのすべてのクエリを実行し、その結果をグローバルレコードセットに格納して関数内で使用する関数を開発したいが、関数またはサブプログラムが終了すると、空(スコープ外)になります。これをどうすれば解決できますか?グローバルなテンポラリレコードセットをモジュール内の交換情報に使用

モジュール内容:

Global rsResultado As ADODB.Recordset 

Sub main() 
    sql = "query works ok, I get data" 
    realizarConsulta (sql) 
    Debug.Print "Check result: " & rsResultado.Fields(0) 'Here I lost data setted in function 
End Sub 

Public Function realizarConsulta(sql As String) As Recordset 
    conectarBD 
    Debug.Print "SQL Ejecutada -->" & sql 
    Set rsResultado = New ADODB.Recordset 

    rsResultado.Open sql, Conn 
    'Set realizarConsulta = rs 
    'Set rsResultado = rs 

    Do While Not rsResultado.EOF 
     Debug.Print "Registro: " & rsResultado.Fields(0) 
     rsResultado.MoveNext 
     'Here I can see the content of the global recordset 
    Loop 

    'rs.Close 
    Conn.Close 
End Function 

は、この問題を解決する方法はありますか?私は何を間違えているのですか? Function内部のお近くにかかわりので

+0

モジュール内にグローバルレコードセットがあり、そのレコードセットを関数またはサブ内に設定して(その情報を入れて)、その関数またはサブ関数の外で使用したいと考えています。しかし、関数(またはサブ)を取得すると、そのレコードセットはコンテキスト外です。関数内で値が設定されているグローバル変数であれば、関数(またはサブ)の外部にデータを保持する必要があります。 – Carol

答えて

0

グローバルRecordsetが空になり、Recordsetは、whileループの後にすべてのレコードを費やし、あなたはFunctionからレコードを設定する必要があります。

のようにメインサブで Recordsetオブジェクトを設定し

1-::を持つ関数内rsResultado.MoveFirst

3-set関数オブジェクトとRecordsetオブジェクト初期Set rsResultado = realizarConsulta(sql)

2-

4は-くださいます。またGlobalするデータベースへの接続を設定する必要がConn

Sub main() 
    '.. 
    Set rsResultado = realizarConsulta(sql) 
    rsResultado.MoveFirst 
    Debug.Print "Check result: " & rsResultado.Fields(0) 
End Sub 

Public Function realizarConsulta(sql As String) As Recordset 
    conectarBD 
    Debug.Print "SQL Ejecutada -->" & sql 
    Set rsResultado = New ADODB.Recordset 

    rsResultado.Open sql, Conn 

    Do While Not rsResultado.EOF 
     Debug.Print "Registro: " & rsResultado.Fields(0) 
     rsResultado.MoveNext 
    Loop 

    Set realizarConsulta = rsResultado 

    'rs.Close 
    'Conn.Close 
End Function 
+0

私はそれを試みましたが、同じ結果を得ています。一度私は関数を得る、グローバルレコードセットはデータがありません。変数インスペクタでは、「コンテキスト外です」という値が表示されます。あなたの答えはありがとう – Carol

+1

私は答えを変更します、それをテストしてください?それは私のためにうまくいく。 –

+0

それは答えです。私はデータベース接続を閉じるために失敗していました。私はそれを試して、それは働いた!どうもありがとう!! – Carol

0

接続オブジェクトを閉じるません。それ以外の場合は、接続が閉じられるとRecordSetがリセットされます。あなたは

Global conDataBaseConnection As ADODB.Connection

を追加するのであれば、それは(私のシステム上でテスト)動作するはずです。

私はあなたのADODB.Connection宣言が表示されていないので、例で名前を付けました。明らかに、プログラミングに合わせてコードを変更する必要があります。

+0

私はBD接続をクローズしたので誤解していました。そうすると、その接続に依存するレコードセットに格納されているデータが失われます。とにかくお時間をありがとう。 – Carol

関連する問題