我在Access 2007中使用带有SQL 2005主干的VB代码。我的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连接)。
有什么想法吗?我在这里很难过。提前谢谢。
杰森
答案 0 :(得分:0)
您是否可以尝试此SQL:
UPDATE tblBMS_Batch SET Status = '70' WHERE Batch_ID = '108582'
字段是存储为数字还是文本?如果文本然后上面可能工作,因为Access严格使用它的语法,而MS SQL可以补偿SQL中的文本/数字字段,只要值匹配(总是一个很好的触摸我认为)
或者,如果必须通过Access运行此SQL,则可以将其作为传递查询运行到SQL服务器,然后它应该以与在服务器上执行它时相同的方式运行。 / p>
答案 1 :(得分:0)
我认为问题是在更新包含Identity字段的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中的保留字,但我还是将括号放在它周围,以防万一。