操作必须对 Access 2007 和 SQL 2005 后端使用可更新的查询错误



我在Access 2007中使用VB代码和SQL 2005主干。我的 SQL 服务器驻留在单独的计算机上,下面的代码在客户端上运行。问题是当我运行下面的 UPDATE 命令时,出现错误"操作必须使用可更新的查询"。我知道这很常见,但我在互联网上的所有研究都没有产生任何与我的情况类似的结果。

Dim MyDB as DAO.Database
Dim sSQL as String
sSQL = "UPDATE tblBMS_Batch SET Status = 70 WHERE Batch_ID = 108582"
MyDB.Execute sSQL

表格设置如下

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[tblBMS_Batch](
[Batch_Id] [int] IDENTITY(1,1) NOT NULL,
[SDetail_Id] [int] NULL,
[Destination_Id] [int] NULL,
[Batch_Number] [smallint] NULL,
[Line_Number] [smallint] NULL,
[Packing_Number] [smallint] NULL,
[Start_Time] [datetime] NULL,
[End_Time] [datetime] NULL,
[Status] [smallint] NULL,
[Batch_Note] [varchar](1000) NULL,
[Employee_Number] [smallint] NULL,
[PLC_BatchNumber] [smallint] NULL,
[Packing_BatchLetter] [varchar](3) NULL,
[Number_Bags] [smallint] NULL,
[Abort_Status] [bit] NULL,
[Return_Bags] [smallint] NULL
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF

错误发生在执行上。为了使它更加混乱,完全相同的 UPDATE 直接在 SQL 中工作,我还可以在同一台机器上的单独应用程序中用其他 VB 代码更新该表(尽管使用 ADODB 连接)。

有什么想法吗?我在这里很困惑。提前谢谢。

杰森

你能试试这个 SQL 吗:

UPDATE tblBMS_Batch SET Status = '70' WHERE Batch_ID = '108582'

字段存储为数字还是文本?如果文本,那么上述内容可能会起作用,因为 Access 的语法很严格,而 MS SQL 可以在 SQL 中的文本/数字字段之间进行补偿,只要值匹配(我认为总是一个不错的触摸)

或者,如果此 SQL 必须通过 Access 运行,则可以将其作为传递查询运行到 SQL 服务器,然后它应以与在服务器上执行它相同的方式运行。

我相信问题是在更新包含标识字段的 SQL Server 表时需要使用 dbSeeChanges 选项。另外,这可能是您的疏忽,但我没有看到您将MyDB设置为任何内容。

Dim MyDB As DAO.Database
Set MyDB = CurrentDb
Dim sSQL As String
sSQL = "UPDATE tblBMS_Batch SET [Status] = 70 WHERE Batch_ID = 108582"
MyDB.Execute sSQL, dbFailOnError + dbSeeChanges
Set MyDB = Nothing

在网上看了几个地方,令我惊讶的是,状态这个词实际上不是SQL Server或MS Access中的保留字,但我还是把它放在了括号周围,以防万一。

最新更新