0

Access 2010 で動的パススルー クエリを使用して、バックエンド データベースから 1 つまたは複数のレコードを取得しています。試行錯誤の末、正しいコードを盗用して、適切なレコードを取得し、OnLoad イベント中にデータシート フォームのバインドされていないテキスト ボックスに割り当てました。残っている唯一の問題は、複数のレコードを表示することです。複数のレコードを取得していることを確認しましたが、各レコードのフィールドの内容は、フォームのテキスト ボックス コントロールに保存された以前の値を上書きするため、データシートに表示されるレコードは常に 1 つだけになります。 1から10まで。

それは簡単な解決策だと確信しています。誰かが私にそれを指摘できますか?

Private Sub Form_Load()
    Dim sqlString As String
    sqlString = "SELECT Transmitter_ID, Receiver_ID, UTC_Date, Local_Date from Detections"
    If Not IsNull(Me.OpenArgs) Then
        sqlString = sqlString & " where " & OpenArgs
    End If

    Dim cnn As New ADODB.Connection
    Dim cmd As New ADODB.Command
    Dim rst As ADODB.Recordset

    'Define and open connection
    cnn.ConnectionString = "DRIVER={SQLite3 ODBC Driver};Database=z:\EWAMP\EWAMP_be_dev.sqlite"
    cnn.Open

    'Define ADO command
    cmd.ActiveConnection = cnn
    cmd.CommandText = sqlString

    'Populate and enumerate through recordset
    Set rst = cmd.Execute
    If rst.EOF Then
       MsgBox "Nothing found...", vbInformation + vbOKOnly
       Exit Sub
    Else
        Do While Not rst.EOF
            '// I'm guessing the problem is with my control assignments, here.
            Me.cntl_Receiver_ID.Value = rst("Receiver_ID")
            Me.cntl_Transmitter_ID.Value = rst("Transmitter_ID")
            Me.cntl_UTC_Date.Value = rst("UTC_Date")
            Me.cntl_Local_Date.Value = rst("Local_Date")
            Debug.Print {Show me the four control values}
            rst.MoveNext
        Loop
    End If

End Sub

乾杯!

DUHdley

4

2 に答える 2

0

データシート ビューのフォームを非連結フォームとして使用できるとは思えません。ただし、ADO レコードセットをフォーム レコードセットとして使用できます。

Set Me.Recordset = rst

次に、フォームが閉じるまで rst という名前の変数を閉じないように注意してください。

もう 1 つの代替ソリューションは、インメモリで製造された切断された ADO レコードセットを使用することです。基本的に、新しいレコードセットを作成し、既存のレコードセットと一致するようにフィールドを追加してから、すべてのデータを新しいレコードセットに移動します。しかし、既に有効なデータが入った ADO レコードセットを持っている場合、これを行う意味がわかりません。

バインドされていないフォームで複数のレコードを表示する必要がある場合、または表示したい場合は、GridView、ListView、TreeView、MSFlexGrid などの ActiveX コントロールを使用する必要があると思います。ほとんどの熟練したプロの Access 開発者は、ActiveX コントロールからできるだけ離れていることに気付きました。それらを使用する場合、通常は TreeView と ListView のみに制限します。これは、どのような問題が発生しても我慢する価値があるだけの十分な価値を追加する唯一の ActiveX コントロールであるためだと思います。

DAO と ADO の違いに関するこの記事をご覧になることをお勧めします。 http://www.utteraccess.com/wiki/index.php/Choosing_between_DAO_and_ADO

于 2012-05-22T04:47:13.907 に答える
0

別のフォーラムの読者が、HK1 によって提示されたものと同様の解決策、つまりSet Me.Recordset = rst. これで元の問題は解決しましたが、別の問題が発生しました。

最初に、4 つのテキスト ボックス コントロールを非バインド フォームに再バインドし、次にhttp://msdn.microsoft.com/en-us/library/ff835419.aspxのサンプルを使用してコードを大幅に変更しました。修正されたコードは次のようになります。

Private Sub Form_Load()
   Dim sqlString As String
   sqlString = "SELECT Transmitter_ID, Receiver_ID, UTC_Date, Local_Date from Detections"
   If Not IsNull(Me.OpenArgs) Then
      sqlString = sqlString & " where " & OpenArgs
   End If

   Dim cn As ADODB.Connection
   Dim rs As ADODB.Recordset

   'Define and open connection
   Set cn = New ADODB.Connection
   cn.ConnectionString = "DRIVER={SQLite3 ODBC Driver};Database=z:\EWAMP\EWAMP_be_dev.sqlite;"
   cn.Open

   'Create an instance of the ADO Recordset class,
   'and set its properties
   Set rs = New ADODB.Recordset
   With rs
       Set .ActiveConnection = cn
       .Source = sqlString
       '// .LockType = adLockOptimistic
       .LockType = adLockReadOnly
       .CursorType = adOpenKeyset
       '// .CursorType = adOpenStatic
       .Open
   End With

   'Set the form's Recordset property to the ADO recordset
   Set Me.Recordset = rs

   Set cn = Nothing
   Set rs = Nothing
End Sub

フォームには、返された 4 つのレコードに対して 4 行、20 レコードに対して 20 行が表示され、少なくとも 256,000 行 (パラメーター セットで指定) まで表示されます。残っている唯一の小さな問題は、4 つ以上のレコードの場合、「最後の行」ナビゲーション ボタン (>|) を押すと、ローカル カーソルが 1 つまたは複数の中間行にフォーカスを設定し、コントロールのプロパティ シートが激しく更新されることです。 (毎秒複数回)。画面に表示できるよりも多くのフォーム行がある場合、最後の行にナビゲートまたはカーソルを移動できません。あたかも記録セットが絶えず更新されているかのようです。

ご覧のとおり、RecordSet の LockType プロパティと CursorType プロパティ (adOpenDynamic と adOpenForwardOnly を含む) をいじってみました。どちらも Set Me.Recordset ステートメントで実行時エラーを引き起こしました。LockType を adLockOptimistic と AdLockReadOnly の間で切り替えたり、CursorType を adOpenKeyset と adOpenStatic の間で切り替えたりしても、取得パフォーマンス (現在は非常に高速です!) や見た目のリフレッシュ レート (残念ながらさらに高速です) に違いはありません。

おそらく、sqlString が「選択」する「検出」テーブルには、最大 4M のレコードが含まれていることに言及する価値があります。以前、このテーブルのパススルー クエリにデータ ソースがバインドされたフォームを使用しようとしたとき、フォームに渡した filter/WhereClause/OpenArgs パラメーターに関係なく、クエリが常に 4M レコード全体をクライアントに返すため、イライラしました。 . 上記の解決策は、接続を閉じることができれば (私は試しました)、RecordSet を一度呼び出した後に静止できれば完璧です。

于 2012-05-22T06:54:51.630 に答える