无DSN连接MS Access前端和SQL服务器后端

问题描述:

我通常不会在MS Access VBA中编程,所以请原谅我的问题,如果它是愚蠢的。无DSN连接MS Access前端和SQL服务器后端

因此,我将MS Access 2010用作前端,将SQL Server 2014用作后端。 (我在前端界面中没有选择,所以请不要在备用选项上提供建议)。

我想以编程方式将SQL服务器的后端链接到我的MS Access前端。我在这里阅读DJ Steele's DSN-less connection page,我可以使用他在此处提供的代码,将SQL Server作为后端进行无DSN连接。

所以我复制了成VBA接入模块,并打开了另一个模块,并运行此代码运行在一个企图DJ斯蒂尔代码连接到一个小的SQL Server数据库我做:

Option Compare Database 
Sub runThis() 
FixConnections "AServerNameHere", "MS_Access_BackEnd_Test" 
End Sub 

据正如我从VBA调试器可以看出的那样,它得到

Set dbCurrent = DBEngine.Workspaces(0).Databases(0) 

那么这个值似乎是空的。我不确定还有什么可以继续进行的,因为据我所知,这是少数我能找到的无DSN连接的完整示例之一。

我不想使用将SQL服务器连接到数据库的DSN方法,因为那需要我访问人员和他们的计算机才能建立链接。 (谁愿意呢?大声笑)

我也看过类似的问题,在写这个问题时与我联系,this接近我想要的,但它一直给我“编译错误:要求常量表达式”为输入:

LinkTable "MS_Access_BackEnd_Test", "Table_1" 

LinkTable "MS_Access_BackEnd_Test", "Table_1", , "AServerNameHere" 

再次声明,我不熟悉的MS Access VBA所以原谅的问题,如果它是瘸子。

+0

你最好的选择可能是'''设置dbCurrent = CurrentDb()''' – 2015-02-18 10:25:07

+0

我替换了Set dbCurrent = DBEngine.Workspaces(0)。数据库(0)设置了dbCurrent = CurrentDb(),但是当我在代码中执行dbCurrent和CurrentDb时,出现了“Run-time error'13':Type mismatch'因为https://msdn.microsoft.com/en-us/library/office/aa221178(v=office.11​​).aspx有没有它们的例子 – user3003304 2015-02-18 15:54:16

+0

虽然当我读到那个页面时它提到这是为了目前在微软的访问窗口中打开数据库,我试图做一个无DSN连接,并将MS Access前端与SQL服务器后端连接起来,所以我不会在MS Access中打开一个当前打开的数据库... – user3003304 2015-02-18 15:55:33

看着DJ斯蒂尔的代码,我是从线

' Unfortunately, I'm current unable to test this code, 
' but I've been told trying this line of code is failing for most people... 
' If it doesn't work for you, just leave it out. 
tdfCurrent.Attributes = typNewTables(intLoop).Attributes 

,我不得不注释掉工作分开。

使用Set dbCurrent = CurrentDb()没有本质上是一回事为Set dbCurrent = DBEngine.Workspaces(0).Databases(0),但后者的意思是快了不少......这些天意味着需要10毫秒,而不是100:-o

你仍然需要dbCurrent作为即使数据来自其他地方,也会引用当前的Access前端,即链接表对象所在的位置。

编辑:为我工作

我添加了一个debug.print线监测是怎么回事

' Build a list of all of the connected TableDefs and 
' the tables to which they're connected. 

For Each tdfCurrent In dbCurrent.TableDefs 
    Debug.Print tdfCurrent.Name, tdfCurrent.Connect 
    If Len(tdfCurrent.Connect) > 0 Then 
     If UCase$(Left$(tdfCurrent.Connect, 5)) = "ODBC;" Then 
      ... 

然后

? currentdb().TableDefs("dbo_Person").Connect 
ODBC;DSN=TacsData;APP=Microsoft Office 2003;WSID=TESTXP;DATABASE=TacsData;Trusted_Connection=Yes;QuotedId=No 

FixConnections "TESTXP\SQLEXPRESS", "TacsData" 

MSysAccessObjects   
MSysAccessXML 
...  
MSysRelationships   
Table1   
dbo_Person ODBC;DSN=TacsData;APP=Microsoft Office 2003;WSID=TESTXP;DATABASE=TacsData;Trusted_Connection=Yes;QuotedId=No 

? currentdb().TableDefs("dbo_Person").Connect 
ODBC;DRIVER=sql server;SERVER=TESTXP\SQLEXPRESS;APP=Microsoft Office 2003;WSID=TESTXP;DATABASE=TacsData;Trusted_Connection=Yes 
+0

I当我用F5去运行它时,我没有收到任何错误消息或任何东西,但它没有创建任何表链接,当我使用F8来完成它时,在立即窗口中输入“dbCurrent”时,得到“运行时错误”13:类型不匹配(对于两个DBEngine.Workspace s(0).Databases(0)和CurrentDb()。 – user3003304 2015-02-23 15:56:32

+0

该错误是因为您无法打印数据库对象。试试'''dbCurrent.Name''' – 2015-02-24 23:29:44