パソコン情報

【Access】レコードセットをフォームのソースにする

 

テーブルをそのままフォームのレコードソースにしてもいいなら問題ないのですが、SqlServerとの接続の問題やらアクセスの動作が鈍い問題やらとあるので、いろいろと考えなければならない時があります。

SqlServerなどを使っている場合は、パススルークエリを使えば、ネットワーク経路に余計なデータが流れずにスピードアップが期待できると聞いています。

 

 

Me.RecordSource = "SELECT * FROM Vew_order WHERE arrange_date ='" & arrange_date_no & "'"

 

上のコードは、arrenge_date_noが文字列の場合です。

arrenge_dateは、数字なのですが、データ型が文字列なので文字列として抽出しています。

 

 

ちなみに、Vew_orderテーブルは、パススルークエリを使ってます。

 

https://pctips.jp/pc-soft/sqlserver-access-delay2019/#i-4

 

たった1行で、フォームを「開く時」とか、「読み込み時」あたりに突っ込んんで置けばレコードセットとしてフォームで使えます。

 

今回のタイトルにあるように、

 

ココがポイント

レコードセットにしてレコードソースとして使ったらどうなのか

 

を検証してみたいと思います。

 

コードだけの説明でわかりずらいかと思いますが、下記のようになります。

 

Private Sub Form_Load()

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

    arrange_data_view = arrange_date_no

'            Debug.Print arrange_date_no

On Error GoTo Err_Handler

    Set cn = CurrentProject.AccessConnection
    Set rs = New ADODB.Recordset

            With rs
            Set .ActiveConnection = cn
            .Source = "SELECT * FROM Vew_order WHERE arrange_date ='" & arrange_date_no & "'"
            .LockType = adLockOptimistic
            .CursorType = adOpenKeyset
            .Open
            End With

        Set Me.Recordset = rs
        rs.Close: Set rs = Nothing
        cn.Close: Set cn = Nothing


'        Me.RecordSource = "SELECT * FROM Vew_order WHERE arrange_date ='" & arrange_date_no & "'"

ExitErr_Handler:
        Exit Sub

Err_Handler:
        MsgBox "エラー: " & Err.description
        rs.Close: Set rs = Nothing
        cn.Close: Set cn = Nothing


End Sub

 

この2種類のスピードの違いは、全く同等でした。考えれば当たり前と言えば当たり前。

結局は、パススルークエリのテーブルデータを引っ張ってきていますから、速度的には変わらないと思います。

体感的にも変わりません。

レコードセットにした時は、そのレコードセットで何か処理をさせた時は、メモリ上のデータで処理するのと、パススルークエリでいちいち引っ張ってきたデータで処理するのとは違いがでるかと推測します。

 

今回のように、ただ単にフォームで見る為のレコードソースとして使う場合は、どちらでもスピード的には変わらないかと思います。