パススルークエリを使ってみることにする。
ODBCリンクテーブル同様、パスワードは平文で保存だからなんでもかんでもということにはならないのだけど。
レコードの編集はできませんが。
パススルークエリを作成する。
Option Compare Database
Option Explicit
Function strCn() As String
strCn = "ODBC;DRIVER=SQL Server Native Client 10.0;" & _
"SERVER=tcp:hogehoge.database.windows.net;" & _
"UID=testdb01user01@hogehoge;" & _
"PWD=P@ssw0rd;" & _
"DATABASE=testdb01;" & _
"Encrypt=yes;"
End Function
Sub CreatePassthroughQuery()
On Error GoTo ErrHnd
Dim dbs As DAO.Database, qdf As DAO.QueryDef
Set dbs = CurrentDb
Set qdf = dbs.CreateQueryDef("PTQ01")
qdf.SQL = "select ID, F01, F02 from dbo.table01"
qdf.Connect = strCn
Application.RefreshDatabaseWindow
Done:
Set qdf = Nothing
Set dbs = Nothing
Exit Sub
ErrHnd:
MsgBox Err.Number & "/" & Error$
Resume Done
End Sub
フィルタはできるのか。
どうやら問題なさそうです。Accessの中の人がいっちょかみするしないで変わるのでしょうか。
このままでは更新とかできないのでちょこっと作りこんでみる。
Option Compare Database
Option Explicit
Private Sub cmdEdit_Click()
DoCmd.OpenForm "formPTQ1Edit", , , , , acDialog
Me.Requery
End Sub
Option Compare Database
Option Explicit
Private Sub Form_Load()
Me.ID = Forms!formPTQ1!ID
Me.F01 = Forms!formPTQ1!F01
Me.F02 = Forms!formPTQ1!F02
End Sub
Private Sub cmdUpdate_Click()
On Error GoTo ErrHnd
Dim dbs As DAO.Database, qdf As DAO.QueryDef
Set dbs = CurrentDb
Set qdf = dbs.CreateQueryDef("")
qdf.Connect = strCn
qdf.SQL = "UPDATE dbo.table01 SET " & _
"F01 = N'" & Me.F01 & "', " & _
"F02 = N'" & Me.F02 & "' " & _
"WHERE ID=" & Me.ID
qdf.ReturnsRecords = False
qdf.Execute
Done:
Set qdf = Nothing
Set dbs = Nothing
DoCmd.Close acForm, Me.Name
Exit Sub
ErrHnd:
MsgBox Err.Number & "/" & Error$
Resume Done
End Sub
Updateステートメントを直接使っているけど、これはいずれストアドプロシージャにせにゃならんだろうし、シングルクォーテーションの扱いもやっておかないと。とりあえずこんな感じで作りこんでいく必要があるんではないかと考えた次第。
更新できました。自動に更新されないからRequeryしてる。
ほんとにとりあえずで試しただけだから、同時実行制御を実装しないと。楽観的同時実行制御でよいかなと思っている。
2 件のコメント:
はじめまして。
MukkuMukuさんの記事は度々参考にさせていただいております。ありがとうございます。
Access2010+SQLServer2008R2 の既存プログラムがありまして、今回それを流用して
Access2010+SQLAzure のプログラムを作ろうとしております。(DBを変えるだけ)
アプリケーション(Access)からデータベースへの接続はプログラミングで行っており、
それにはADOを使っているのですが、(ADO.ConnectionStringプロパティにDBへのODBC接続文字列を設定している)
こちらの記事ですとDAO(QueryDef)を使われているのですね。
データベースがSQLAzureの場合はADOよりDAOを使った方が良いでしょうか?
その理由等、ご意見をお聞きかせいただけると嬉しいです。
よろしくお願いいたします。
ADOのままでよいのでは?Azureデータベースでサポートされていない機能がなければトラフィックに負担が発生していないことを確認するとかで事足りるかなと思います。
DAO:Access Connectivity Engineを経由してODBCデータベースに接続
ACEが面倒なことを引き受けてくれるので手軽。ただしACEの機能を理解しておかないと期待するパフォーマンスが得られないことがある。2015年にDAOに関連してだらだらとPOSTしてますので参考になれば。
ADO:直接ODBCデータベースに接続
ODBCデータベースの機能の多くは使用できることになるけど、Access特有の機能が使えるような工夫が必要かもしれない。
コメントを投稿