3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

(VB.Net)DBへの接続文字列を動的に変更させる方法

OLE DBでのデータベースへの接続を動的に変更させる方法です。

Visual Studio のデザイナで各 TableAdpter の接続先は、Settings.settings で指定したものとしてます。

これをソフトの起動時に設定ファイル等を読み込んで、接続先を動的に変更させるというのが要件です。

いろいろ方法はあると思うのですが、今回はここを参考にさせてもらいました。

要は、各 TableAdpter の接続先となっている Settings.settings で設定した接続文字列をコード内で置き換えるというものです。

とりえず、Settings.settings 内で接続文字列を2つ用意してみました。

┏━━━━━━━━━━━┳━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓

┃名前 ┃型 ┃スコープ ┃値 ┃

┣━━━━━━━━━━━╋━━━━━━╋━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫

┃ConnectionString_mdb ┃(接続文字列)┃アプリケーション┃Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\Data.mdb;Persist Security Info=True┃

┣━━━━━━━━━━━╋━━━━━━╋━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫

┃ConnectionString_sqlsv┃(接続文字列)┃アプリケーション┃Provider=SQLOLEDB;Persist Security Info=True;User ID=sa ┃

┗━━━━━━━━━━━┻━━━━━━┻━━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

各 TableAdpter の接続先とは ConnectionString_mdb としています。

そして、 Settings.settings をソリューションエクスプローラで右クリック→「ファイルを開くアプリケーションを選択」で、「XMLエディタ」で開きます。

(XMLエディタで開くのは、設定デザイナでは接続文字列のスコープが変更できないため)

その XML エディタ上で各接続文字列について、Scope を "Application" から "User" に変更します。

(スコープを "User" に変更すると、My.MySettings.Default.ConnectionString_mdb が書き込み可能(ReadOnlyでなくなる)となります)

 Name="ConnectionString_sqlsv" Type="(Connection string)" Scope="Application">

  ↓(Scopeを変更する)

Name="ConnectionString_sqlsv" Type="(Connection string)" Scope="User">

Settings.settings を保存後、DB接続コードが書いてるより手前で接続文字列を変更します。

下記の例ではスタートアップフォームのコンストラクタで接続文字列を変更させてます。

'デザイナにて TableAdapter の接続先は ConnectionString_mdb としている前提

'接続文字列の設定

Dim mode As Integer = 1

Dim sb As New OleDb.OleDbConnectionStringBuilder()

If mode = 0 Then

'MDB

sb.ConnectionString = My.MySettings.Default.ConnectionString_mdb

sb("Jet OLEDB:Database Password") = "1234"

sb("Data Source") = DataPath.GetDataBaseFilePath()

ElseIf mode = 1 Then

'SQL

sb.ConnectionString = My.MySettings.Default.ConnectionString_sqlsv

sb("Data Source") = "testsv\SQLEXPRESS"

sb("Initial Catalog") = "testDB"

sb("Password") = "1234"

End If

'変更した接続文字列をTableAdapterのデザイナで指定してる接続文字列に置き換える

My.MySettings.Default.ConnectionString_mdb = sb.ConnectionString

上記の例では Data Source や Password などはリテラルを使ってますが、本来なら設定ファイルを読み込む部分を、このコードより前に書き、そこで取得した値を使うのがいいと思います。

このほかにもTableAdapterのPartialクラスで動的に変更させたりするなどいくつか方法があるようです。

それら別方法については下記リンクが参考になると思います。

TableAdapterの接続文字列を変更する方法

ADO.NET TableAdapterの接続文字列を動的に変更したい TableAdapterのPartialクラスを使う方法です。コメント欄にサンプルソースが載ってます。

下記は接続文字列にかんするMSの情報です。

MSDN:接続文字列の使用 接続文字列の基本的考え方です。

MSDN:接続文字列と構成ファイル (ADO.NET) DBの設定を保存する構成ファイルの暗号化等についても書かれてます。DBのパスワードを構成ファイルに入れる場合は必見。

MSDN:接続文字列ビルダ (ADO.NET) ○○ConnectionStringBuilder を使った接続文字列の設定方法です。