我一直在寻找答案,因为有很多类似的问题,但没有找到这个特殊情况。
我有一个SQL服务器和一个访问文件(前端)。此Access文件具有与SQL Server链接的链接表,每次尝试打开一个表时,都会出现一个询问用户和密码的提示。
好的,这是完美的,因为它(几乎)是我想要的行为。
此外,还有一个本地表,其中包含加密密码的用户/密码。每次用户打开文件时,他/她的传递都会被解密,我想打开一个连接,因此链接表不会要求传递。
有人知道如何编码此连接吗?
提前致谢!
答案 0 :(得分:5)
我认为你想要的是"DSN-LESS connection"。我过去做过类似的事。基本上,在用户登录时,您使用基于用户凭据构建的连接字符串重新链接表。
有关详细信息,请先查看此SO Question。
此外,以下是我过去使用的一些例程,您可以自由使用\ modify。从您的登录过程中调用这些。
Public Function RelinkDSNTables( _
ByVal ServerName As String, _
ByVal DatabaseName As String, _
ByVal UserName As String, _
ByVal Password As String) As Boolean
On Error GoTo Err_Handler
Dim dsn As String
dsn = GetDSNLink(ServerName, DatabaseName, UserName, Password)
Dim td As TableDef
Dim db As DAO.Database
Set db = CurrentDb
Dim rst As ADODB.Recordset
'Get a list of tables that need to be relinked'
If GetLocalRecordSet(rst, "SELECT * FROM TableMapping") < 1 Then
Err.Raise 1000, "Missing Tables!", "Missing Table Mappings!"
End If
Dim fNeedToRefresh As Boolean
'See if we actually need to relink the tables'
For Each td In db.TableDefs
If td.Connect <> vbNullString Then
If td.Connect <> dsn Then
fNeedToRefresh = True
Exit For
End If
End If
Next td
If fNeedToRefresh = False Then
RelinkDSNTables = True
GoTo Err_Handler
End If
'Drop linked table in Access'
For Each td In CurrentDb.TableDefs
If td.Connect <> vbNullString Then
CurrentDb.TableDefs.Delete td.Name
End If
Next td
'Create new linked table using new DSN'
rst.MoveFirst
Do Until rst.EOF
Set td = db.CreateTableDef(rst!LocalTableName, dbAttachSavePWD, rst!RemoteTableName, dsn)
db.TableDefs.Append td
rst.MoveNext
Loop
'Because I am paranoid, refresh the link'
db.TableDefs.Refresh
For Each td In db.TableDefs
If td.Connect <> "" Then td.RefreshLink
Next td
RelinkDSNTables = True
Err_Handler:
If Err.Number = 3011 Then
'Happens if user does not have permission in SQL Server; Nothing to see here, move along'
Err.Clear
Resume Next
ElseIf Err.Number = 3010 Then
'already exists; should not occur, but if it does eat the exception and move on'
Err.Clear
Resume Next
ElseIf Err.Number <> 0 Then
Err.Raise Err.Number, Err.Source, Err.Description
End If
End Function
Private Function GetDSNLink( _
ByVal ServerName As String, _
ByVal DatabaseName As String, _
ByVal UserName As String, _
ByVal Password As String) As String
On Error GoTo Err_Handler
If ServerName = "" Or DatabaseName = "" Then
Err.Raise -1220, "Missing Server \ DB", _
"Unable to refresh table links because you are missing the server or database name!"
End If
Dim dsnLink As String
If UserName = "" Then
'trusted connection'
dsnLink = "ODBC;DRIVER=SQL Server;SERVER=" & ServerName & _
";DATABASE=" & DatabaseName & ";Trusted_Connection=Yes"
Else
'MixedMode connection'
'//WARNING: This will save the username and the password with the linked table information.
dsnLink = "ODBC;DRIVER=SQL Server;SERVER=" & ServerName & _
";DATABASE=" & DatabaseName & ";UID=" & UserName & ";PWD=" & Password
End If
GetDSNLink = dsnLink
Err_Handler:
If Err.Number <> 0 Then
Err.Raise Err.Number, Err.Source, Err.Description
End If
End Function
编辑:添加了示例GetLocalRecordSet功能
Public Function GetLocalRecordSet(ByRef rs As ADODB.Recordset, ByVal sql As String) As Long
On Error GoTo Err_Handler
If sql = vbNullString Then
Err.Raise vbObjectError + 1001, _
"Empty SQL String", "Empty SQL String Passed to GetLocalRecordset Function!"
End If
Set rs = New ADODB.Recordset
rs.Open sql, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
If rs Is Nothing Then
GetLocalRecordSet = -1
GoTo Err_Handler
End If
If rs.State = adStateOpen Then
If Not rs.EOF Then
rs.MoveLast
GetLocalRecordSet = rs.RecordCount 'store number of records
rs.MoveFirst
Else
GetLocalRecordSet = 0
End If
Else
GetLocalRecordSet = -2
End If
Err_Handler:
If Err.Number <> 0 Then
Err.Raise Err.Number, Err.Source, Err.Description
End If
End Function
答案 1 :(得分:0)
您可以使用存储在本地表中的用户名/密码编写代码以编程方式连接到SQL数据库。这应该在Access app load上发生(例如,使用Autoexec宏)。
您可以在此处阅读有关Autoexec宏的信息:http://www.vb123.com/toolshed/05_map/ch04_autoexec.htm
所以,你会有一个功能,例如在应用程序启动时从Autoexec宏调用的OpenConnection()。任何后续的表格开头都不应提示输入密码。
我不确定这是否适用于SQL后端。希望它会。