告诉SQL Server 2008 R2使用用户名和密码,以避免使用Access 2010 VBA和链接表时出现错误18



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

我已经使用Doug Steele网站上的代码成功地为我的表创建了无DSN连接http://www.accessmvp.com/djsteele/DSNLessLinks.html但是我在从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)

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

那么,第一,为什么Access/SQL在我不希望的情况下不断尝试使用windows身份验证进行连接。有没有办法指定NOT?Trusted_Connection = NO似乎不起作用。

其次(不太重要,但很奇怪),登录ID是自动填充的,但不是我在代码中登录时所拥有的ID。为什么SQL Server获取不同的登录ID?

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

我已经仔细检查过了,我的SQL Server设置为"混合模式"以允许登录和密码。(根据MS SQL Server(2008 R2)Access 2010错误18452)

我确实安装了"Native Client"(根据"How do I setup and ADODB connection to 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

几件事:

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

使用SQL studio工具,通过经过身份验证的用户断开与数据库的连接,现在通过新的SQL登录重新连接。换句话说,要100%确信这样的SQL登录可以从SSMS工作。然后(并且只有在那时),尝试从Access连接。因此,在SSMS测试+尝试您的SQL登录+密码,以确保它有效,并允许您打开/使用表。考虑让SQL登录成为数据库的"所有者",然后为该表创建相同名称的用户。

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

下一篇:

您的"测试"登录语法不正确,将始终返回false。尝试通过SSMA将您的选择字符串键入到sql server中,并注意它是如何不起作用的(该选择永远不会起作用)。

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

我只想使用:

.SQL = "Select Current_User;"

因此,您的共享空间+()不起作用,需要删除。

此外,我建议您包括网络DBMSSOCN,因为这意味着通过TCP/IP连接。你可能是,但这会强化问题。

例如:

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

一旦您确保在SSMS中通过SQL登录而不是windows身份验证进行连接,然后修复您的登录"选择"命令。

还要注意,要使密码缓存作为"常规"规则工作,您使用的测试登录字符串必须与链接字符串+您的uid/密码相同。因此,tabledef链接的字符串没有uid/密码。

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

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

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-pcSQLEXPRESS", "MyTestDec222", "test", "test")
   Debug.Print TestLogin(strcon)

End Sub

我会在不启动任何Access表单等的情况下运行/测试上述例程,所以只需测试/使用上述代码即可。你需要让你的登录工作,当登录工作时,提示就会消失。

相关内容

  • 没有找到相关文章

最新更新