2014-05-01 139 views
1

我有一个Access窗体,使用链接的SQL Server表作为数据源。我将需要很快将这个文件分发给其他用户,我需要一种编程方式将DSN安装到他们的机器上。 这是链接手动设置过程:如何以编程方式创建DSN?

外部数据>更多> ODBC数据库>链接到数据源>机器数据源选项卡> 按新>用户数据源> SQL服务器>名称=由你; server = serverName>SQL服务器应该如何验证登录ID的真实性?使用Windows NT身份验证使用网络登录ID>附加数据库文件名(数据库名称)>选择表并按下确定

这就是我所做的访问我的表,但我希望它,使用户可以按一个按钮并访问表,并在同一时间通过使用Windows NT身份验证进行身份验证。

我有麻烦找到一种方法来写入访问VBA代码可以有人指示我在正确的方向吗?

+0

我认为,用户必须建立一个ODBC系统DSN第一。然后他们可以通过Access访问SQL Server。 –

+0

所以,你想以编程方式创建使用vba的ODBC系统DSN?那是对的吗? – RubberDuck

+0

我不是要求SQL访问链接服务器我正在寻找访问SQL。 – CaptainKid

回答

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 Server时采用上述两种方法的。

2

首先,Albert D. Kallal绝对正确his answer。如果你可以使用无DSN连接,你应该。但是,为了回答您提出的问题...

ODBC DSN条目存储在Windows注册表中。您可以通过直接修改Windows注册表来添加。如果您不熟悉注册表,我不建议这样做。如果您移除/更改错误的键,则可以使机器变砖。我们要查找的特定键位于HKEY_LOCAL_MACHINE和HKEY_CURRENT_USER的Software/ODBC下,具体取决于我们是分别寻找系统还是用户odbc连接。

我的解决方案太长,涉及在Stack Overflow上发布完整内容。您可以通过find it on my blog under VBA ODBC DSN Installer完成类模块下载以及如何使用它们的示例。 (全面披露,其中之一就是originally written by Steve McMahon,但我已经修改了它与MS Access中使用。)

简短的版本是我建了一个DSN类对麦克马洪先生的注册表类的顶部,以便在安装DSN的我MS Access应用程序已启动。

1

这个问题对于“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 

现在,当用户打开Access数据库,飞溅的形式检查对于DSN的存在,如果找不到,则为用户提供创建它的选项。

你提到NT验证;我假设用户已经登录到一个域并且已经使用这些凭证向SQL服务器提供了访问权限,我使用了一个可信连接。您可能需要修改DSN连接字符串以提示输入密码和用户名。

+0

+1导入调用设置。解决方案的一个缺点是用户需要知道该在哪里以及由此产生的不一致的设置。我可以看到使用该库调用来以编程方式确保我做到的一致性。 – RubberDuck

+0

我100%承认这是一个快速而肮脏的解决方案,可以作出假设。我把它放在更重要的位置,我很欣赏反馈。 –

相关问题