2013年5月12日日曜日

VB ファイルベースの DB の接続を切り替える

ちょっと、へそ曲がりな提案です。  ... というか苦肉の策。
Visual Basic で SQL Server Compact のようなファイルベースのデータベース群を、
接続切り替えで使い回すひとつの方法です。
マスタと予備 とか ユーザー毎に別のデータベース とか 、簡単に応用できます。



実は、Visual Basic 2008 Express Edition SP1 を使っていて、データベースの動的な接続先変更で躓いてしまいました。
SQL Server Compact のデータベースには型付データセットを使い、接続文字列はプロジェクトに保存してあります。
SQL Server Compact の場合、接続文字列は単なるファイルのフルパス名です。
知識の無さを曝け出すようですが、どうやっても、スコープをアプリケーションからユーザーに変更できません。
ですから、接続文字列は、読み取り専用で、変更が効きません。
ハードコーディングで皆書いてしまえば良いのでしょうが、楽も  したい。

さぁ 困った ... 。

そうです、基本に帰りましょう。  SQL Server Compact のデータベース は ファイルベース!

同じ構造のデータベースを複数用意し、利用環境や状況に応じて、切り替える。

ポイントは、ファイルのコピーです。

  接続に使うファイル名を固定してしまいます。
  アクセス権が許す場所にファイルの実態を置きます。 (名前が変わっても可)
  開発時は固定したファイルを対象に、接続やデータセットそしてコントロールをバインドしてソフトを作り上げます。
  接続先の切り替えはデータの取得( Fill )の前に、実態から上書きコピー です。


次のような、使い道が考えられます。

  
  デバッグ用にテストデータを別途用意する。                 ( 以下に例示 )
  バックアップ用にデータベースをコピーし、必要に応じてリストアする。
  ユーザー毎に別のデータベースを用意する。
Friend Const DBName As String = "C:¥Users¥xxx¥Documents¥AppName¥Master.sdf"
Friend Const DBBack As String = "C:¥Users¥xxx¥Documents¥AppName¥BackUp.sdf"
#If DEBUG Then
    Friend Const DBTest As String = "C:¥Users¥xxx¥Documents¥AppName¥TestDB.sdf"
#End If

' イベントハンドラの中で Fill の前に挿入 Debug 用データに切替
#If DEBUG Then
   IO.File.Copy(DBName, DBBack, True)
   IO.File.Copy(DBTest, DBName, True)
#End If
' Fill

' イベントハンドラの中で 終了処理の前に挿入 正規のデータに戻す
#If DEBUG Then
   IO.File.Copy(DBBack, DBName True)
   IO.File.Copy(DBName, DBTest, True)   '  Debug 時のデータ変更を破棄する場合不要
#End If
' Me.Close()

あぁ~ スマートじゃないですね。 接続文字列が書き換えられればなぁ ... 。
何方か 良い方法があれば教えて下さい。  ( 当方環境: VB2008SP1EE + SQLServerCE3.5SP1 )


0 件のコメント:

コメントを投稿