上記の私のコメントとYawarの回答に沿って、パススルークエリが編集/更新可能であることに気づいていません。保存パススルークエリオブジェクトを編集できるという意味で編集可能ですが、パススルークエリで編集可能なレコードセットを作成することはできないと思います。
AccessをAccess以外のデータソースに接続するには、基本的に2つの方法があります。
最初の方法で最も一般的な方法は、何らかの形式のリンクテーブル、通常はODBCリンクテーブルを使用することです。 MS AccessでODBCリンクテーブルを使用するにはさまざまな方法がありますが、ほとんどの開発者は、アプリケーションの起動時に更新または再構築(削除および再接続)されるDSN-Less接続を使用することを好みます。 ODBCを使用する場合は、DAOも使用していることに注意してください。 DAOはMSAccessに組み込まれているデフォルトのデータアクセスオブジェクトであり、DAOコードを特に記述していなくても、MS Accessはフォーム、レポート、クエリをデータソースにリンクするために内部でDAOを使用しています。 ODBCの場合、実際には、DAOとODBCの2つのデータアクセスレイヤーが機能することになります。ただし、ODBC / DAOは、コードを記述せずに(ODBCリンクテーブルを維持する以外に)かなり適切なパフォーマンスで使用できます。
2番目の方法は、ADOを使用することです。一般に信じられていることとは反対に、これはバインドされていないフォームを使用する必要があるという意味ではありません。ただし、JET / DAO/MSAccessまたはDAO/ODBC /SSQLServerを使用するよりも多くのコードを作成する必要があることを意味します。データベースからADORecordsetにレコードを取り込むコードを記述してから、コードを使用してフォームをそのRecordsetにバインドする必要があります。子フォームを親フォームと同期させたり、新しいレコードが作成されたときに外部キーを子フォームに挿入したり、フォームに組み込まれているフィルタリングや並べ替えとしてのフィルタリングや並べ替えなど、さまざまなコードを記述したりする必要があります。オプションは通常、ADOレコードセットでは機能しません。 ADOは、SQL Serverと通信するための優れた方法です。これは、実際に多くの制御を提供するためですが、コードが集中し、ODBCリンクテーブルが非常にうまく機能するため、他に方法がない場合を除いて、ほとんどの開発者はADOの使用を推奨しません。あなたがしたい。この一例は、ストアドプロシージャの呼び出しです。パススルークエリを使用してストアドプロシージャを呼び出すことができると思いますが、そこにはいくつかの制限もあると思います(パラメータの使用など)。ほとんどの場合、開発者はADOを使用してストアドプロシージャを呼び出すと思います。私はADOをよく使用しますが、ストアドプロシージャはあまり使用しないので(まだ)、それに関する情報はあまりありません。
言及する価値のあるもう1つのことは、ODBCを使用するDAOは「遅延読み込み」を使用しますが、ADOはすべてのデータをプルすることを強制します。これは、非常に時間がかかり、数百万を超える行がある場合に大量のメモリを消費する可能性があります。そうしないと、ある種のページングを実装する必要があります。
単一のDSN-LessODBCリンクテーブルを作成するための私自身の関数を以下に示します。 AccessとVBAを初めて使用する場合、これはおそらくあまり意味がありません。このコードは、リンクしようとしているテーブルにすでに存在するテーブル定義を削除します。これは、リンクされていないローカルのテーブルを削除する可能性があるため、少し危険です。ここでのエラー処理も実際には高速ではありませんが、ほとんどのオンラインサンプルコードでは、複雑な問題が発生するため、適切なエラー処理が行われていません。リンクテーブルに主キーインデックスを作成する必要は必ずしもありません。特定のプロジェクトで一度必要だったので、関数に組み込んだだけなので、今はそのままにして、良くも悪くも使用しています。
このコードを適切に使用するには、リンクされているすべてのテーブルのリストをどこかに置き、そのリストを繰り返し処理して、テーブルごとにこの関数を呼び出す必要があります。この関数を使用すると、SQLServerでの実際の名前とは異なる名前を使用してテーブルをリンクできます。また、この関数にも渡す必要がある有効なODBC接続文字列を作成する方法が必要です。
Private Sub LinkODBCTable(sSourceTableName As String, _
sLocalTableName As String, _
sPrimaryKeyField As String, _
sConString As String)
Dim dbCurrent As DAO.Database
Dim tdfCurrent As DAO.TableDef
Set dbCurrent = DBEngine.Workspaces(0).Databases(0)
On Error Resume Next
'Be Careful, this could delete a local, non-linked table.
dbCurrent.TableDefs.Delete sLocalTableName
If Err.Number <> 0 Then
If Err.Number = 3011 Then
'Table does not exist
Else
MsgBox "Error in LinkODBCTable" & vbCrLf & vbCrLf & Err.Number & " " & Err.Description
End If
Err.Clear
End If
On Error GoTo 0
Set tdfCurrent = dbCurrent.CreateTableDef(sLocalTableName)
tdfCurrent.Connect = sConString
tdfCurrent.sourceTableName = sSourceTableName
dbCurrent.TableDefs.Append tdfCurrent
On Error Resume Next
If sPrimaryKeyField <> "" Then
dbCurrent.Execute "CREATE INDEX __UniqueIndex ON [" & sLocalTableName & "] (" & sPrimaryKeyField & ")", dbFailOnError
If Err.Number <> 0 Then
If Err.Number = 3283 Then
'Primary Key Already Exists
Else
MsgBox "Error in LinkODBCTable" & vbCrLf & vbCrLf & Err.Number & " " & Err.Description
End If
Err.Clear
End If
End If
Set tdfCurrent = Nothing
Set dbCurrent = Nothing
End Sub
DAO、ADO、パススルークエリ、SQLServerなどに関して確認する必要のある非常に優れたリソースがいくつかあります。
http://technet.microsoft.com /en-us/library/bb188204%28v=sql.90%29.aspx
http://www.utteraccess.com/wiki/Choosing_between_DAO_and_ADO
フォームをADORecordsetにバインドする例を次に示します。ただし、アプリケーションの実行時に開いたままのグローバル接続オブジェクトを用意するのが最善であるため、少し誤解を招く可能性があります。これにより、自動的に更新可能なADOレコードセットを使用できます。この方法を使用すると、レコードセットがフォームレベルのオブジェクトになる場合もあります。
http://msdn.microsoft .com / en-us / library / office / bb243828%28v =office.12%29.aspx