2011-11-07 7 views
1

ADOレコードセットを返す関数があります。これは、後続の関数を供給するために使用されます。これらの関数の1つに初めて渡されたとき、正常に動作します。次の関数では、レコードセットはEOFにあります。私は、私のレコードセットがBy Refを渡していると仮定したので、MoveFirstを使って試してみました。これは、カーソルのタイプが前方のみとしてデフォルト設定されているため、エラーです。ADOレコードセットで複数の関数を連続して渡すとデータが失われる(Access VBA)

私は次のことを試してみました:

  • By Valとしてそれをパラメータを設定します。これは効果がありませんでした。
  • レコードセットのコピーを作成し、最初の関数で元のものを使用し、2番目の関数でコピーを使用しました。それと同じ問題です(2番目はEOFです。これはEOFではなく空であることを意味しますが、2つのレコードセットが何らかの方法で接続されているとは想像できませんが)。
  • 別のカーソルタイプ(adOpenStatic)を使用するようにDBコードを変更しました。これは実際には私のアプリケーションにとってより正確ですが、それは非常に奇妙な結果をもたらしました。つまり、変更の前に正常に機能したクエリでは、最初のフィールドは返されませんでした。これは重要なことなので、このルートを続行できませんでした。


メインDBクエリ機能:GetData。 SQLとvarcharパラメータのリスト(存在する場合)を取得し、レコードセットを返します。 dbOpenを参照し、提供された資格情報との接続を単に開きます。

Dim myRecords as ADODB.Recordset 

' For the sake of argument, we assume this returns a nontrivial recordset 
Set myRecords = GetData(someDSN, someSQL, someParameters) 

Debug.Print myRecords.EOF ' Returns False 

ID = writeHeader(myRecords) 

Debug.Print myRecords.EOF ' Returns True 

writeData ID, myRecords ' Breaks because at EOF 

writeHeader機能がMoveNextを使用して、レコードセット内の各レコードを通過します:

Private Function GetData(ODBC As DBConnection, ByVal QuerySQL As String, Optional Parameters As Collection) As ADODB.Recordset 
    Dim DB As ADODB.Connection 
    Dim Query As ADODB.Command 
    Dim Parameter As ADODB.Parameter 

    Set DB = New ADODB.Connection 

    If dbOpen(DB, ODBC) Then 
     Set Query = New ADODB.Command 
     Query.ActiveConnection = DB 
     Query.CommandText = QuerySQL 

     If Not Parameters Is Nothing Then 
      For Each param In Parameters 
       Set Parameter = Query.CreateParameter(, adVarChar, adParamInput, Len(param), param) 
       Query.Parameters.Append Parameter 
      Next 
      Set Parameter = Nothing 
     End If 

     Set GetData = Query.Execute 

     ' Uncommenting this seems to reset the data in GetData... 
     ' A bit of a memory leak, but we assume VBA will take care of it :P 
     'dbClose DB 
    Else 
     MsgBox "Cannot connect to the database.", vbExclamation 
     Set GetData = Nothing 
    End If 
End Function 

は、私は、このような何かを行います。しかし、私がmyRecordsを値またはコピーとして渡すと、EOFの問題が発生します。レコードの反復コードwriteHeaderの末尾にMoveFirstを追加すると、そのようなレコードセットの先頭に移動できないという不満があります。 Set GetData = Query.Executeに変更されるように、私は私のGetData機能を変更する場合: - 変更されていない - 私のコードでは、クエリが実行された後

Set GetData = New ADODB.Recordset 

GetData.CursorType = adOpenStatic 
GetData.Open Query 

、最初のフィールドは、レコードセットの一部(ではありません例えば、myRecords!IDが最初のフィールドだと言ってください:これが参照されていれば、そのアイテムがレコードのメンバーではないという警告が表示されます(列挙されたメンバーでもないので、myRecords.Fields(1)が返すだけです)。クエリの次のフィールド)。 @TimWilliamsから有用な先端で

+1

コードを投稿してください... – RedFilter

+0

OK、十分に...私は何かをまとめてみましょう。私は上記の編集として追加します。 – Xophmeister

+1

adOpenKeysetで試したことがありますか?また、GetDataに値を割り当てた後に変更する必要があるかどうか不安です。私は通常、別の変数を使用し、それが完了したら関数の戻り値に代入します。 –

答えて

1

は、私は次のように私のGetData機能を変更することで、これを解決:

Private Function GetData(ODBC As DBConnection, ByVal QuerySQL As String, Optional Parameters As Collection) As ADODB.Recordset 
    Dim DB As ADODB.Connection 
    Dim Query As ADODB.Command 
    Dim Parameter As ADODB.Parameter 
    Dim Output As ADODB.Recordset 

    Set DB = New ADODB.Connection 

    If dbOpen(DB, ODBC) Then 
     Set Query = New ADODB.Command 
     Query.ActiveConnection = DB 
     Query.CommandText = QuerySQL 

     If Not Parameters Is Nothing Then 
      For Each param In Parameters 
       Set Parameter = Query.CreateParameter(, adVarChar, adParamInput, Len(param), param) 
       Query.Parameters.Append Parameter 
      Next 
      Set Parameter = Nothing 
     End If 

     Set Output = New ADODB.Recordset 
     Output.CursorType = adOpenStatic 
     Output.CursorLocation = adUseClient 
     Output.Open Query 
    Else 
     MsgBox "Cannot connect to the database.", vbExclamation 
     Set Output = Nothing 
    End If 

    Set GetData = Output 
End Function 

その後、レコードセットをカーソ前に、私はMoveFirstを使用しています。

関連する問題