2011/08/13

access2010 SQL Azureいってみようか -9-

パススルークエリを使ってみることにする。
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を使った方が良いでしょうか?
その理由等、ご意見をお聞きかせいただけると嬉しいです。
よろしくお願いいたします。

MukkuMuku さんのコメント...

ADOのままでよいのでは?Azureデータベースでサポートされていない機能がなければトラフィックに負担が発生していないことを確認するとかで事足りるかなと思います。

DAO:Access Connectivity Engineを経由してODBCデータベースに接続
ACEが面倒なことを引き受けてくれるので手軽。ただしACEの機能を理解しておかないと期待するパフォーマンスが得られないことがある。2015年にDAOに関連してだらだらとPOSTしてますので参考になれば。

ADO:直接ODBCデータベースに接続
ODBCデータベースの機能の多くは使用できることになるけど、Access特有の機能が使えるような工夫が必要かもしれない。