如何以编程方式创建DSN?

时间:2014-05-01 18:08:14

标签: sql-server vba ms-access access-vba

我有一个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代码,有人可以指导我正确的方向吗?

3 个答案:

答案 0 :(得分:5)

作为一般规则,通过使用DSN less连接可以获得更好的成功。这将消除许多问题和问题。此处概述了如何使用DSN较少的连接: http://www.accessmvp.com/djsteele/DSNLessLinks.html

此外,您不希望在连接字符串中存储用户名+密码,而只是“登录”一次。这再次节省了大量麻烦,也意味着您的连接字符串和/或DSN不必在实际链接中保存和公开用户名和密码。

这种方法意味着您可以进行不同的登录,而不必重新链接或更改现有的表链接。

以下显示了如何使用缓存登录,这样就可以在不必重新链接表的情况下进行不同的登录。

http://blogs.office.com/b/microsoft-access/archive/2011/04/08/power-tip-improve-the-security-of-database-connections.aspx

我强烈建议您在将链接表用于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

我使用那里找到的代码,herehere来拼凑这些并将其置于启动画面形式的公开事件中:

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连接字符串以提示输入密码和用户名。