我正在使用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表单等的情况下运行/测试上述例程,所以只需测试/使用上述代码即可。你需要让你的登录工作,当登录工作时,提示就会消失。