どのように実行しても、ユーザー入力に基づいて接続文字列を変更することになります。ユーザー入力を直接使用しないでください。ただし、許容値のリストに対して検証してください。これを行うには、 Select Case ステートメントをお勧めします。
' Do this when logging in: '
Dim companyName
companyName = Request.Form("companyName")
Select Case companyName
Case "company1"
Session("companyDB") = "company1"
Case "company2"
Session("companyDB") = "company2"
Case Else
Session.Contents.Remove("companyDB")
' Invalid login! '
End Select
' Do this when connecting to the database: '
Dim connectionString
If Session("companyDB") Then
connectionString = "...database=" & Session("companyDB") & "..."
Else
' Invalid login, go log in again '
End If
ある会社を 1 つのタブで開き、別の会社を別のタブで開きたいユーザーがいる場合、これは問題を引き起こすことに注意してください。最近ログインした会社の情報しか表示されないのはなぜかと疑問に思うでしょう。
これが問題になる場合は、各リンクのクエリ文字列でトークンを渡したいと思うでしょう。これにより複雑さが増しますが、それほど大きくはありません (すべてのリンクを変更するという面倒な作業を除けば)。次に、次のようになります。
' Do this when logging in: '
Dim companyName
companyName = Request.Form("companyName")
Select Case companyName
Case "company1"
Session("company1 - db") = "company1DBName"
Case "company2"
Session("company2 - db") = "company2DBName"
Case Else
' Invalid login! '
End Select
' Do this when connecting to the database: '
Dim connectionString, companyToken
companyToken = Request("companyToken")
If Session(companyToken & " - db") Then
connectionString = "...database=" & Session(companyToken & " - db") & "..."
Else
' Invalid login, go log in again
End If
これは、簡単にするために、トークンが会社名と同じであることを前提としています。たとえば、誰かが「company1」にログインします。正常に完了すると、データベースの名前 (この場合は「company1DBName」) を含む「company1 - db」というセッション変数を取得します。
ここで、ユーザーがたどるすべてのリンクには、"?companyToken=company1" のようなクエリ文字列が含まれている必要があります。したがって、データベースに接続するときは、そのトークンを取得し、それを使用して正しいデータベース名を見つけます: Session("company1" + " - デシベル") = "company1DBName"
その会社にまだログインしていない場合 (または単に会社名を作っただけの場合) は、そのセッション変数を持っていないため、ログイン画面に移動する必要があります。
一度に 2 つの会社でログインしても、すべてのリンクでデータベース名を取得できるため、これで対処できます。
わかる?
何をするにしても、ユーザー入力を使用して接続文字列を直接作成しないでください。つまり、次の方法は間違っています。
Dim connectionString
connectionString = "...database=" & Request.Form("companyDB") & "..."
幸運を!