【发布时间】:2010-03-11 16:20:33
【问题描述】:
我们需要找到一种方法来以编程方式将 SQL Server 数据库中的所有表链接到访问数据库。我们将从使用 .net/SQL Server 2008 的程序中调用此访问数据库。
在调用应用程序时,我们希望添加链接表,以便用户可以通过访问运行报告/模块,而不必担心链接表。我们有办法做到这一点吗?
【问题讨论】:
标签: sql-server ms-access
我们需要找到一种方法来以编程方式将 SQL Server 数据库中的所有表链接到访问数据库。我们将从使用 .net/SQL Server 2008 的程序中调用此访问数据库。
在调用应用程序时,我们希望添加链接表,以便用户可以通过访问运行报告/模块,而不必担心链接表。我们有办法做到这一点吗?
【问题讨论】:
标签: sql-server ms-access
这里有一些注释。
Dim sLocalName As String
Dim tdf As TableDef
Dim rs As dao.Recordset
''This is a basic connection string, you may need to consider password and so forth
cn = "ODBC;DSN=TheDSNName;Trusted_Connection=Yes;APP=Microsoft Office 2010;DATABASE=TheDatabaseName;"
''All fields from tables
strSQL = "SELECT TABLE_CATALOG, " _
& "TABLE_SCHEMA, " _
& "TABLE_NAME, " _
& "TABLE_TYPE " _
& "FROM [" & cn & "].INFORMATION_SCHEMA.tables " _
& "WHERE TABLE_TYPE = 'BASE TABLE'"
Set rs = CurrentDb.OpenRecordset(strSQL)
Do While Not rs.EOF
sLocalName = rs!TABLE_SCHEMA & "_" & rs!TABLE_NAME
With CurrentDb
If DLookup("Name", "MSysObjects", "Name='" & sLocalName & "'") <> vbNullString Then
If .TableDefs(sLocalName).Connect <> cn Then
.TableDefs(sLocalName).Connect = cn
.TableDefs(sLocalName).RefreshLink
End If
Else
''If the table does not have a unique index, you will neded to create one
''if you wish to update.
Set tdf = .CreateTableDef(sLocalName)
tdf.Connect = cn
tdf.SourceTableName = rs!TABLE_NAME
.TableDefs.Append tdf
.TableDefs.Refresh
''This will produce a message box if the table does not have a unique index
''DoCmd.TransferDatabase acLink, "ODBC Database", cn, acTable, rs!TABLE_NAME, sLocalName
End If
End With
rs.MoveNext
Loop
【讨论】:
您需要与 SQL 数据库建立 ODBC 连接。准备好此连接后,您可以将其用于要链接的所有表:
DoCmd.TransferDatabase acLink, _
"ODBC Database", _
myODBCconnection, _
myDatabaseName, _
acTable, _
myTableName
我猜您可以“即时”声明您的 ODBC 连接器,例如建议 here。
要枚举您的表,您有以下选项:
在所有情况下,此过程都应使用 autoexec 宏启动,这意味着每次用户打开 mdb 客户端时都会创建\更新链接。
【讨论】:
您将use ADOX 进行实际链接。
就枚举您所连接的数据库中的表而言,您可以执行一些简单的操作,例如针对您的 SQL Server 运行此查询,但是有很多方法可以给这只猫换皮:
SELECT * FROM INFORMATION_SCHEMA.TABLES
【讨论】:
您可以通过在 SQL Server 中使用指向 Access db 的链接服务器来实现等效功能。这将使您可以访问 Access db 中的所有表,以便您可以像这样引用它们:
Select ..
From [LinkedServerName]...[AccessTableName]
顺便说一句,链接服务器可能对你想要的东西来说太过分了。查看 OPENROWSET 函数,它可以有效地让您传递连接字符串。
编辑:我最初读到这个问题的字面意思是“链接表 in SQL Server to 访问”,我将其翻译为从 SQL 到 Access 的意思。因此,鉴于此,我的解决方案将适用。但是,如果希望从 Access 转到 SQL,那就不同了,其他解决方案会更合适。
【讨论】: