SQL Server Compact EditionのDBをVBAからアクセスする


なんで今頃SQL Server Compact Edition

SQL Server Compact Edition(以下SQL Server CE)で作成されたシステムをリプレースするという仕事があり、現行システムのデータを加工しようと思ってExcel VBAを作成しようとしたところ、接続文字列の情報が見つけにくかった(自分のググレベルが低い)のでこちらに書いておこうかと思った次第です。
.NETでのアクセスは一杯載ってるので、そちらで作ってしまえばいいんですがとりあえず。

接続文字列

で、本題のSQL Server Compact EditionをVBAからアクセスする場合の接続文字列は以下のような感じになります。

"Provider=Microsoft.SQLSERVER.CE.OLEDB.3.5;Data Source=[データベースファイル名];SSCE:Database Password=[データベースパスワード];"

データベースファイルにパスワードがない場合はSSCE:Database Passwordの項目は不要だと思います。

実際のVBA例

実際にVBAでアクセスする場合はまずVBAのエディタウィンドウの方の[ツール]メニュー→[参照設定]で、「Microsoft ActiveX Data Objects 2.x Library」にチェックを入れた上で、下記のような感じになります。2.xの部分は色々あって特に気にしなくていいのではと思いますが当方は2.8にチェックを入れました。

Sheet1.bas
Private Sub cboTest_Click()

    Dim objCon As New ADODB.Connection
    Dim pRS As New ADODB.Recordset
    Dim sConStr As String
    Dim sSql As String

    objCon.ConnectionString = "Provider=Microsoft.SQLSERVER.CE.OLEDB.3.5;Data Source=C:\DB\TEST.sdf;SSCE:Database Password=TEST;"
    'データベースオープン
    objCon.Open

    'SQL文 TESTテーブルのレコードを検索
    sSql = "SELECT * FROM TEST"

    'SQL文を実行して結果を取得
    pRS.Open sSql, objCon

    '結果の数だけレコードの処理
    While Not pRS.EOF
        '見つかったレコードのIDカラムを取得してダイアログに表示
        Call MsgBox("ID=" & CStr(pRS.Fields("ID")))
        pRS.MoveNext    '次のレコードへ移動
    Wend

    pRS.Close   '結果セットを使い終わったらクローズ
    objCon.Close   'DB接続クローズ
    set pRS = Nothing    '結果セットオブジェクト解放
    Set objCon = Nothing    '接続オブジェクト解放

End Sub

おまけ

たまにしか使わないのですぐ忘れるのでついでに、、、

・DB内にあるテーブル名を取得するSQL

SELECT * FROM INFORMATION_SCHEMA.TABLES
 →TABLE_NAME列にテーブル名が入っている

・DB内にあるテーブルのカラム名を取得するSQL

SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='[テーブル名]'
 →COLUMN_NAME列にカラム名が入っている

SQL Server CEのsdfファイルはSSMS(SQL Server Management Studio)の2008以前のバージョンでしか読めないので、新しいSSMSを使っていると二重に入れておかないといけないのでディスク容量の無駄ですね・・。