我正在使用此代码来附加DSN较少的表。
'//Name : AttachDSNLessTable
'//Purpose : Create a linked table to SQL Server without using a DSN
'//Parameters
'// stLocalTableName: Name of the table that you are creating in the current database
'// stRemoteTableName: Name of the table that you are linking to on the SQL Server database
'// stServer: Name of the SQL Server that you are linking to
'// stDatabase: Name of the SQL Server database that you are linking to
'// stUsername: Name of the SQL Server user who can connect to SQL Server, leave blank to use a Trusted Connection
'// stPassword: SQL Server user password
Function AttachDSNLessTable(stLocalTableName As String, stRemoteTableName As String, stServer As String, stDatabase As String, Optional stUsername As String, Optional stPassword As String)
On Error GoTo AttachDSNLessTable_Err
Dim td As TableDef
Dim stConnect As String
For Each td In CurrentDb.TableDefs
If td.Name = stLocalTableName Then
CurrentDb.TableDefs.Delete stLocalTableName
End If
Next
If Len(stUsername) = 0 Then
'//Use trusted authentication if stUsername is not supplied.
stConnect = "ODBC;DRIVER=SQL Server;SERVER=" & stServer & ";DATABASE=" & stDatabase & ";Trusted_Connection=Yes"
Else
'//WARNING: This will save the username and the password with the linked table information.
stConnect = "ODBC;DRIVER=SQL Server;SERVER=" & stServer & ";DATABASE=" & stDatabase & ";UID=" & stUsername & ";PWD=" & stPassword
End If
Set td = CurrentDb.CreateTableDef(stLocalTableName, dbAttachSavePWD, stRemoteTableName, stConnect)
CurrentDb.TableDefs.Append td
AttachDSNLessTable = True
Exit Function
AttachDSNLessTable_Err:
AttachDSNLessTable = False
MsgBox "AttachDSNLessTable encountered an unexpected error: " & Err.Description
End Function
假设我使用ADO更改了链接表的架构:
cn.execute "Alter table table 1 add add Name string not null"
我知道这将更改SQL Server中的表。
我认为MS Access中的链接表始终反映对SQL Server中的表所做的任何更改。为什么我们需要删除本地表并重新链接它以反映架构更改?
答案 0 :(得分:3)
简单的答案是,出于性能考虑,仅在链接时保存和收集架构更改。
链接表实际上无法知道表结构已更改,直到您告诉Access进行检查(通过简单地刷新表)。
我的意思是,当您在网页上时,他们可能会添加一些新文章或更改布局。然后,Web服务器不会向互联网上的所有人发出呼叫,并告诉他们该页面已更新。似乎很愚蠢。
表结构在链接时被拉出。如果您每次触摸或使用桌子,性能都会受到很大影响,并且必须进行许多额外的检查,交谈和与服务器的通信。
如果链接表未保存有关本地模式的信息,则不会出现此问题。
但是,链接到表不仅可以保存连接信息,还可以保存有关表结构的信息。
从表中提取数据是一个巨大而又巨大的问题,然后要求sql server发送整个表结构。 (因此,如果这样做了–您仍然必须更新本地信息)。
我的意思是,我的表单可能有150个字段中的2个字段。为什么我要让所有如此大量的信息沿着网络管道通过,只在表单上显示两个文本框?为什么每次都会减少150列信息(名称,长度,数据类型,自动编号等,索引)?
您是否看到sql上每一列的属性表?它提供了大量信息。实际上,当您拥有100列或更多列时,信息就是大量数据。通过网络管道发送的信息将比您正在编辑的一条小记录中包含的数据还要多!!!
我的意思是,您可能链接到仅包含几列的sql server上的视图。因此,每次查询和对该视图的使用都只会提取在视图时定义的列。
实际上,在修改视图时,即使是sql server上的其他视图也很难更新。结果,即使使用纯SQL Server进行查询(甚至是查询视图),甚至经常需要“告诉”您最初开始使用的数据结构和列已更改。
因此,Access中的链接表与sql服务器上保存的视图没有太大不同。如果更新基本表,则必须在sql server上执行sp_refeshview命令以更新视图以了解这些更改。
我的意思是,如果您从服务器上获取Word文档,而其他人开始修改服务器上的副本,那么每个工作站是否都知道更改?服务器现在可以伸出手了吗?
因此,有关架构的信息会在链接时保留,并且仅通过“使用”链接表就不会发生架构的重新创建和构建。进行更改后,您便具有访问权限以重新加载架构。
必须检查架构,并为每条记录或每次获取一些数据更新访问时的信息,这是一个昂贵且耗时的过程。
由于要提取99.9%的数据,因此架构不会改变,因此每次都具有提取和测试架构的所有开销没有任何意义(这是一个糟糕的想法和设计)。 / p>
如前所述,即使不使用Access并在sql server上使用指向现有表的视图,该模式也会保留在该视图中,直到您刷新该视图为止。
这个问题和问题当然不仅限于Access的Access后端或SQL Server的后端。大多数数据库产品都不会突然更新,例如出于性能原因而保留原始架构的视图。
我的意思是,我正在访问表单上,然后移至下一条记录。您是否现在告诉我Access应该开始与服务器对话并询问架构是否已更改?完全没有道理迫使客户端收集所有这些信息并重新保存架构信息。
我想也许在每个第一个表上使用给定的会话Access可以查询此信息,但是实际上,当前正在工作的所有用户怎么办?他们仍然看不到架构更改。
模式更改也很少见。如果他们很频繁,那么开发人员就出了点问题-不是数据库系统