我有一个Access表单,它使用链接的sql server表作为数据源。我需要尽快将此文件分发给其他用户,我需要一种方法来以编程方式将DSN安装到他们的计算机上。 这是手动设置链接的过程:
外部数据&gt;更多&gt; ODBC数据库&gt;链接到数据源&gt;机器数据源选项卡&gt; 按新&gt; <用户数据源> sql server&gt; name =由你决定; server = serverName&gt; SQL Server如何验证登录ID的真实性?使用网络登录ID进行Windows NT身份验证&gt;附加数据库文件名(数据库名称)&gt;选择表格然后按确定
这就是我访问我的表所做的,但我希望用户可以按下按钮并访问该表,同时通过使用Windows NT身份验证进行身份验证。
我无法找到一种方法来写入访问vba代码,有人可以指导我正确的方向吗?
答案 0 :(得分:5)
作为一般规则,通过使用DSN less连接可以获得更好的成功。这将消除许多问题和问题。此处概述了如何使用DSN较少的连接: http://www.accessmvp.com/djsteele/DSNLessLinks.html
此外,您不希望在连接字符串中存储用户名+密码,而只是“登录”一次。这再次节省了大量麻烦,也意味着您的连接字符串和/或DSN不必在实际链接中保存和公开用户名和密码。
这种方法意味着您可以进行不同的登录,而不必重新链接或更改现有的表链接。
以下显示了如何使用缓存登录,这样就可以在不必重新链接表的情况下进行不同的登录。
我强烈建议您在将链接表用于SQL服务器时采用上述两种方法。
答案 1 :(得分:2)
首先,Albert D. Kallal与his answer绝对正确。如果您可以使用无DSN连接,则应该。但是,为了回答你问的问题......
ODBC DSN条目存储在Windows注册表中。您可以通过直接修改Windows注册表来添加。如果您不熟悉注册表,我不建议这样做。如果删除/更改错误的键,则可以对机器进行砖块处理。我们正在寻找的特定键位于HKEY_LOCAL_MACHINE和HKEY_CURRENT_USER的软件/ ODBC下,具体取决于我们是否分别查找系统或用户odbc连接。
我的解决方案太长并且需要在Stack Overflow上完整地发布它。您可以find it on my blog under VBA ODBC DSN Installer完成课程模块下载以及如何使用它们的示例。 (完全公开,其中一个是originally written by Steve McMahon,但我已将其修改为与MS Access一起使用。)
简短版本是我在McMahon先生的注册表类之上构建了一个DSN类,以便在启动MS Access应用程序时安装DSN。
答案 2 :(得分:2)
这个问题是“VBA创建DSN”的第一个谷歌结果,但我不喜欢这些答案,因为它们似乎围绕触摸注册表或以其他方式避免使用DSN。在我的情况下,我有一个想要使用DSN的项目经理,因为这是他们所熟悉的,所以我无法避免它。对于任何正在努力解决这个问题的人来说,我发现了一种非常直接的方式在其他地方做到值得注意的是开始here。
我使用那里找到的代码,here和here来拼凑这些并将其置于启动画面形式的公开事件中:
Private Declare Function SQLConfigDataSource Lib "ODBCCP32.DLL" _
(ByVal hwndParent As Long, ByVal fRequest As Long, _
ByVal lpszDriver As String, ByVal lpszAttributes As String) As Long
Private Sub Form_Open(Cancel As Integer)
On Error Resume Next
If fDsnExist("DSN=YOUR_DSN_NAME") = True Then
'Do all of your loading or just close this form.
Else
Dim doContinue As Integer
doContinue = MsgBox("There is an issue with the database connection. This can be corrected now or you can reach out to support." _
& vbCrLf & vbCrLf & "Do you want to attempt to correct the issue now?", vbYesNo, "Connection Error")
If doContinue = vbYes Then
Dim vAttributes As String
vAttributes = "DSN=YOUR_DSN_NAME" & Chr(0)
vAttributes = vAttributes & "Description=Self Explnatory" & Chr(0)
vAttributes = vAttributes & "Trusted_Connection=Yes" & Chr(0)
vAttributes = vAttributes & "Server=YOUR_SQL_SERVER_ADDRESS" & Chr(0)
vAttributes = vAttributes & "Database=YOUR_DATABASE_NAME" & Chr(0)
SQLConfigDataSource 0&, 1, "SQL Server", vAttributes
If Err.Number <> 0 Then
MsgBox "The connection could not be restored. Please report this error to support: " & vbCrLf & vbCrLf & Err.Description
Err.Clear
DoCmd.Close acForm, "frmSplash"
DoCmd.Quit acQuitSaveNone
Else
MsgBox "The Connection has been restored.", , "Success"
End If
Else
MsgBox "Please contact support to resolve this issue.", vbCritical + vbOKOnly, "Error"
DoCmd.Close acForm, "frmSplash"
DoCmd.Quit acQuitSaveNone
End If
End If
End Sub
Function fDsnExist(strDsn)
On Error Resume Next
' ------------------------------------------------------
' Declare Variables
' ------------------------------------------------------
Dim objConnection
Dim strReturn
' ------------------------------------------------------
' Create database object
' ------------------------------------------------------
Set objConnection = CreateObject("ADODB.Connection")
objConnection.ConnectionString = strDsn
objConnection.Open
' ------------------------------------------------------
' Check if database is open Correctly
' ------------------------------------------------------
If Err.Number <> 0 Then
strReturn = False
Err.Clear
Else
strReturn = True
' ------------------------------------------------------
' Close database connection
' ------------------------------------------------------
objConnection.Close
End If
Set objConnection = Nothing
' ------------------------------------------------------
' Return database status
' ------------------------------------------------------
fDsnExist = strReturn
End Function
现在,当用户打开访问数据库时,启动窗体会检查是否存在DSN,如果找不到,则为用户提供创建它的选项。
你提到过NT身份验证;我假设用户已经登录到域并使用这些凭据访问SQL服务器时使用了可信连接。您可能需要修改DSN连接字符串以提示输入密码和用户名。