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から有用な先端で
コードを投稿してください... – RedFilter
OK、十分に...私は何かをまとめてみましょう。私は上記の編集として追加します。 – Xophmeister
adOpenKeysetで試したことがありますか?また、GetDataに値を割り当てた後に変更する必要があるかどうか不安です。私は通常、別の変数を使用し、それが完了したら関数の戻り値に代入します。 –