Sql server 如何使直通/直通查询可编辑?

Sql server 如何使直通/直通查询可编辑?,sql-server,ms-access,ms-access-2007,passthru,pass-through,Sql Server,Ms Access,Ms Access 2007,Passthru,Pass Through,在具有SQL Server后端的Microsoft Access 2007中,我们通常将SQL Server中的链接表作为可编辑表单的Form.RecordSource,以进行单个表数据修改。本地查询用于合并多个链接表字段的交叉表版本。为了修改编辑表单上的数据,本地查询本身必须是可更新的 现在,我们计划用直通查询替换所有本地查询,以便直接使用本机SQL Server表 我尝试使用以下SQL字符串创建一个名为qrySelpProductsPassThroughEditable的非常简单的passt

在具有SQL Server后端的Microsoft Access 2007中,我们通常将SQL Server中的链接表作为可编辑表单的Form.RecordSource,以进行单个表数据修改。本地查询用于合并多个链接表字段的交叉表版本。为了修改编辑表单上的数据,本地查询本身必须是可更新的

现在,我们计划用直通查询替换所有本地查询,以便直接使用本机SQL Server表

我尝试使用以下SQL字符串创建一个名为qrySelpProductsPassThroughEditable的非常简单的passthru查询:

SELECT dbo.Products.ID, dbo.Products.Name FROM dbo.Products;
ID字段是SQL Server中定义为主键的标识字段,定义如下:

CREATE TABLE [dbo].[Products](
    [ID] [int] IDENTITY(1,1) NOT NULL,
        ....
)
但Access传递查询返回的数据表完全不可编辑。因此它也不能作为.RecordSource用于编辑表单

与此相反,如果passthru查询包含所有相关表的所有主键,则该查询将是可编辑的

结论增加了后验概率
通过下面的讨论,Microsoft Access 2007.accdb、.accde或.accdr(Access运行时)中的直通查询始终是只读的,从不可编辑。您应该将其用作最终列表或报表的.RecordSource,而不是用于必须使用链接表的窗体,或涉及数据IO链接表的可写普通查询。

传递查询结果集不可编辑,但是基于链接表的访问查询肯定是这样。

根据我上面的评论和Yawar的回答,我不知道传递查询是可编辑/可更新的。它们是可编辑的,因为您可以编辑保存传递查询对象,但我认为传递查询不可能生成可编辑的记录集

将访问连接到非访问数据源基本上有两种方法

第一种方法,也是最流行的方法,是使用某种形式的链接表,通常是ODBC链接表。通过MS Access使用ODBC链接表有多种方法,但大多数开发人员更喜欢使用DSN较少的连接,这些连接在应用程序启动时被刷新或重建(删除并重新连接)。请注意,当您使用ODBC时,您仍然在使用DAO。DAO是MS access中内置的默认数据访问对象,即使您没有专门编写任何DAO代码,MS access仍在幕后使用DAO将表单、报表和查询链接到数据源。在ODBC的情况下,实际上有两个数据访问层在工作,DAO和ODBC。但是,您可以使用ODBC/DAO,它的性能相当不错,而且不需要编写代码(除了维护ODBC链接表之外)

第二种方法是使用ADO。与流行的观点相反,这并不意味着必须使用未绑定的表单。但这确实意味着您必须编写比使用JET/DAO/MSAccess或DAO/ODBC/SSQL服务器更多的代码。您必须编写代码将数据库中的记录引入ADO和记录集,然后使用代码将表单绑定到该记录集。您必须编写更多的代码来保持子窗体与父窗体同步,在创建新记录时将外键插入子窗体,以及其他各种事情,如筛选和排序,因为窗体的内置筛选和排序选项通常不适用于ADO记录集。ADO是与SQL Server对话的一种很好的方式,因为它确实为您提供了很多控制,但由于它的代码密集,并且ODBC链接表工作得非常好,大多数开发人员不建议使用ADO,除非没有其他方法来做您想做的事情。其中一个例子是调用存储过程。我相信传递查询可以用来调用存储过程,但我也认为存在一些限制(例如使用参数)。我相信在大多数情况下,开发人员使用ADO调用存储过程。我经常使用ADO,但我不太使用存储过程(目前还没有),所以我没有关于这方面的很多信息

另一件值得一提的事情是,带有ODBC的DAO使用“延迟加载”,但ADO强制您提取所有数据,这可能非常耗时,如果您有>数百万行,则会消耗大量内存。否则,您将需要实现某种分页

下面是我自己创建单个无DSN ODBC链接表的函数。如果您是Access新手和VBA新手,这可能对您来说没有多大意义。代码会删除您试图链接的表中已经存在的任何表定义,这有点危险,因为我相信它可能会删除您不想要的本地非链接表。这里的错误处理速度也不是很快,但是大多数在线示例代码中都没有很好的错误处理,因为其中涉及的复杂性。在链接表上创建主键索引并不总是必要的。我只是将它内置到我的函数中,因为我在某个特定项目中需要它一次,所以现在我将它留在那里并使用它,无论是好是坏

为了正确使用这段代码,您确实需要在某个地方有一个包含所有链接表的列表,并遍历该列表,并为每个表调用此函数。此函数允许您使用与SQL Server中实际名称不同的名称链接表。您还需要有一种构建有效ODBC连接字符串的方法,该字符串也必须传递到此函数中

私有子链接ODBCTable(sSourceTableName作为字符串_
sLocalTableName作为字符串_
将Marykeyfield作为字符串_
(以字符串形式显示)
Dim dbCurrent作为DAO.Database
Dim TDFCCurrent作为DAO.TableDef
设置dbCurrent=DBEngine.Workspaces(0).数据库(0)
出错时继续下一步
'小心,这可能会删除本地文件,不是吗
SELECT SOH.SalesOrderID, SOH.OrderDate
FROM   Sales.SalesOrderHeader as SOH 
SELECT SOH.SalesOrderID, SOH.OrderDate
FROM   [ODBC;Driver=SQL Server;Server=myServer;Database=AdventureWorks2012;Trusted_Connection=Yes;MarsConn=yes;].Sales.SalesOrderHeader as SOH