不管你怎么做,你最终都会根据用户输入改变你的连接字符串。不要直接使用用户输入,而是根据可接受的值列表对其进行验证。我建议使用 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
请记住,如果您的用户希望在一个选项卡中打开一家公司,而在另一个选项卡中打开另一家公司,这将导致麻烦。他们会想知道为什么他们只能看到他们最近登录的公司的信息。
如果这将成为一个问题,您可能希望在每个链接的查询字符串中传递一个令牌。这增加了复杂性,但不是特别多(除了更改每个链接的繁琐任务)。然后它看起来像这样:
' 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”。成功完成后,他们得到一个名为“company1 - db”的会话变量,其中包含数据库的名称(在本例中为“company1DBName”)。
现在,他们关注的每个链接都应该有一个查询字符串,例如“?companyToken=company1”。因此,当您连接到数据库时,您获取该令牌并使用它来查找正确的数据库名称: Session("company1" + " - db") = "company1DBName"
如果他们还没有登录到那家公司(或者他们只是编了一个公司名称),他们将没有那个会话变量,他们必须进入登录屏幕。
如果他们同时登录两家公司,您现在可以处理它,因为您将获得每个链接上的数据库名称。
说得通?
无论您做什么,都不要使用用户输入直接创建连接字符串。换句话说,以下是错误的方法:
Dim connectionString
connectionString = "...database=" & Request.Form("companyDB") & "..."
祝你好运!