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 件のコメント:
コメントを投稿