1

我正在使用 SQL Server 2008 R2 和 MS Access 2010。我有一个带有链接表的 .accdb 并使用登录名和密码而不是 Windows 身份验证,因为我们有几个远程用户。使用 SSMS 或我的 Access .adp 项目使用此登录名和密码没有问题。

我已经使用 Doug Steele 网站http://www.accessmvp.com/djsteele/DSNLessLinks.html的代码成功地为我的表创建了 DSN-less 连接, 但是我无法从 MS Office 博客http 中创建缓存连接: //blogs.office.com/2011/04/08/power-tip-improve-the-security-of-database-connections/

我继续收到以下错误:

Connection Failed: SQLState ;28000', Server Error 18452, 
The login is from an untrusted domain and cannot 
be used with Windows authentication.

这是代码尝试将测试查询传递给 SQL 的地方:

Set rst = dbCurrent.OpenRecordset(strTable, dbOpenSnapshot)

然后,当我单击“确定”时,我得到了Use trusted connection选中的 SQL Server 登录屏幕(我不想要)和一个自动填充的登录 ID,它不是我通过代码提供的 ID。

所以,第一,为什么 Access/SQL 在我不想要的时候不断尝试使用 Windows 身份验证进行连接。有没有办法指定不? Trusted_Connection = NO似乎不起作用。

其次(不太重要,但很好奇),登录 ID 是自动填充的,但不是我在代码中用于登录的 ID。为什么 SQL Server 选择不同的登录 ID?

注意: 如果我取消选中Use trusted connection并填写正确的登录名和密码(VBA 代码正确接收 - 我检查debug.print了用于检查我的连接字符串),则缓存连接有效。因此我也知道我的连接字符串在代码中是正确的。

我已经仔细检查了,我的 SQL Server 设置为“混合模式”以允许登录名和密码。(每个帖子 MS SQL Server (2008 R2) 错误 18452 与 Access 2010)

我确实安装了“本机客户端”(根据帖子“我如何设置和 ADODB 连接到 SQL Server 2008 inf Microsoft Access 2010)

我的代码:

Dim dbCurrent As DAO.Database
Dim qdf As DAO.QueryDef
Dim rst As DAO.Recordset
Dim strConnection As String

Dim strTable As String

strTable = "one of my linked tables"

strConnection = "ODBC;DRIVER={sql Server};" & _
                "DATABASE=MyDatabase;" & _
                "SERVER=MyServer;"

Set dbCurrent = DBEngine.Workspaces(0).Databases(0)
Set qdf = dbCurrent.CreateQueryDef("")

With qdf
    .Connect = strConnection & _
               "UID=" & strUserName & ";" & _
               "PWD=" & strPassword
    .SQL = "Select Current_User ();"

    Set rst = dbCurrent.OpenRecordset(strTable, dbOpenSnapshot)

End Wit
InitConnect = True
4

1 回答 1

1

一些东西:

首先,确保您创建的 SQL 登录有效。请注意,您既需要 sql 登录,也需要为给定数据库创建的 SQL 用户(所以不要混淆 SQL Server 登录和 SQL Server 用户登录之间的区别——这是常见的混淆)

使用 SQL Studio 工具并通过经过身份验证的用户断开与数据库的连接,现在通过新的 SQL 登录重新连接。换句话说,100% 确定此类 SQL 登录可以从 SSMS 工作。然后(并且仅在那时)尝试从 Access 连接。所以在 SSMS 测试 + 尝试你的 SQL 登录 + 密码以确保它工作并让你打开/使用表。考虑将 SQL 登录设置为数据库的“所有者”,然后为该表创建同名用户。

我当然假设您将 SQL 服务器设置为混合模式?如果用户没有登录到您的域,那么您很可能在解析服务器名称时遇到问题。(尝试使用 \192.0.0.50\sqlExpress 或任何你的 sql ip 地址和实例名称)。

接下来:

您的“测试”登录语法不正确,并且总是返回 false。尝试通过 SSMA 将您的选择字符串输入 sql server,并注意它是如何不起作用的(选择永远不会起作用)。

删除您拥有的空格和 ()。

我只会使用:

.SQL = "Select Current_User;"

所以你的空间+ () 不起作用,需要删除。

另外,我建议您包括 Network-DBMSSOCN,因为这意味着通过 TCP/IP 连接。您可能是,但这会强制执行此问题。

例如:

  dbCon = "ODBC;DRIVER="SQL Server;" & _
       "SERVER=" & ServerName & ";" & _
       "DATABASE=" & DataBaseName & ";" & _
       "UID=" & USERid & ";" & _
       "PWD=" & USERpw & ";" & _
       "Network=DBMSSOCN"

一旦你确保通过 SQL 登录而不是 Windows 身份验证在 SSMS 中工作,然后修复你的登录“选择”命令。

另请注意,要使密码缓存作为“一般”规则工作,您使用的测试登录字符串必须与链接字符串 + 您的 uid/密码相同。所以 tabledef 链接字符串没有 uid/密码。

因此,如果保存的表链接在连接字符串中有“APP”等内容或其他不需要的部分,那么您的 TEST 登录连接字符串应该具有这些相同的额外值以及额外的 uid/logon。因此,如果您的测试登录和测试连接字符串与现有保存的链接“不同”,那么缓存可能会出现问题,以匹配正确的表和服务器。

我用于测试登录的代码是:

Function TestLogin(strcon As String) As Boolean

  On Error GoTo TestError

  Dim dbs          As DAO.Database
  Dim qdf          As DAO.QueryDef

  Set dbs = CurrentDb()
  Set qdf = dbs.CreateQueryDef("")

   qdf.Connect = strcon

   qdf.ReturnsRecords = False

   'Any VALID SQL statement that runs on server will work below.
    qdf.SQL = "Select Current_User;"
   qdf.Execute

   TestLogin = True

   Exit Function

 TestError:
   TestLogin = False
   Exit Function

End Function

创建字符串的代码是:

Public Function dbCon(ServerName As String, _
                     DataBaseName As String, _
                     USERid As String, _
                     USERpw As String, _
                     Optional APP As String = "Office 2010", _
                     Optional WSID As String = "SC", _
                     Optional IntegratedSecurity As Boolean = False) As String

      ' returns a SQL server conneciton string
  If IntegratedSecurity = False Then
     dbCon = "ODBC;DRIVER={" & SQLDRIVER & "};" & _
             "SERVER=" & ServerName & ";" & _
             "DATABASE=" & DataBaseName & ";" & _
             "UID=" & USERid & ";" & _
             "PWD=" & USERpw & ";" & _
             "Network=DBMSSOCN"

  Else
     dbCon = "ODBC;DRIVER=" & SQLDRIVER & ";" & _
             "SERVER=" & ServerName & ";" & _
             "DATABASE=" & DataBaseName & ";" & _
             "APP=" & APP & ";" & _
             "WSID=" & WSID & ";" & _
             "Network=DBMSSOCN" & ";" & _
             "Integrated Security= SSPI"
  End If


End Function

我的登录“测试”是:

Public Sub Logon()

  ' this simply tests + logs in the user to the default database.
  ' once this occurs, then a odbc logon prompt for each linked table
  ' should not occur - this works WHEN the connection string used here
  ' matches the odbc connection string exaclty.

    Dim strcon     As String


   ' con string settings are:

   ' server , DataBaseName, User, Password, [Optional Application name], [Optional work station]
   ' last two optional are for sql performance tracing etc. - not required

   strcon = dbCon("albertkallal-pc\SQLEXPRESS", "MyTestDec222", "test", "test")

   Debug.Print TestLogin(strcon)


End Sub

我会在不启动任何访问表单等的情况下运行/测试上述例程。所以只需测试/使用上面的代码。您需要让您的登录正常工作,当登录正常时,​​提示将消失。

于 2014-09-23T01:36:17.227 回答