1

需要一种通过登录 ASP 经典连接到唯一 SQL 数据库的方法。

设置

  • Web 应用程序:ASP 经典/SQL 2005。
  • Webapp 为多家公司存储信息。
  • 所有数据都存储在一个主 SQL 2005 中。所有数据库都将在同一台服务器上。
  • 每个用户都有一个唯一的登录名(公司、用户 ID、密码)
  • 连接使用无 DSN 连接的主数据库包含文件
  • IE: (dbConn.Open "driver={SQL Server};server=11.22.333.444;database=mywebdb","mylogin","mypassword")

需求:

想把公司拆分成自己的数据库。当用户登录时,公司名称会告诉APP为每个公司使用唯一的SQL db连接。

由于动态包含文件不是一种选择,那么最好的方法是什么?

谢谢!

4

2 回答 2

1

连接字符串必须存储在某个地方,对吗?我猜是一个包含 .asp 的文件。

在其中添加代码以检查公司名称(存储在会话中?)并相应地修复连接字符串。

编辑

问题是您可能在无数不同的 ASP 页面中有代码,假设适当的连接字符串在您的 db.asp 包含文件中声明的变量中可用(我们称之为 m_connStr)。您不想为了满足这个新要求而修改所有这些页面。

因此,您只想编辑 db.asp 包含文件,并且只想让 m_connStr 神奇地指向正确的数据库。

一旦您知道公司在 Session 变量中设置了数据库名称,就有您的登录页面。

您现有的代码具有如下连接字符串:-

m_connStr = "driver={SQL Server};server=11.22.333.444 database=mywebdb", "mylogin", "mypassword"

所以我们将使用一个模板:-

m_connStrTemplate = "driver={SQL Server};server=11.22.333.444 database=%db%", "mylogin", "mypassword"

If Session("database") <> "" Then
    m_connStr = Replace(m_connStrTemplate, "%db%", Session("database"))
End If

请注意,不存在的数据库会话变量会导致未定义连接字符串,因此您不会意外连接到默认数据库。

现在,就您所有的 ASP 页面而言,它照常营业,但连接字符串将根据与登录用户关联的公司的不同会话而有所不同。

于 2009-07-17T16:24:05.713 回答
0

不管你怎么做,你最终都会根据用户输入改变你的连接字符串。不要直接使用用户输入,而是根据可接受的值列表对其进行验证。我建议使用 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") & "..."

祝你好运!

于 2009-07-17T16:23:58.290 回答