1

我在 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 连接)。

有任何想法吗?我在这里很困惑。提前致谢。

杰森

4

2 回答 2

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

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

于 2012-05-16T14:59:50.567 回答
0

你能试试这个SQL:

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

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

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

于 2012-05-16T11:01:10.230 回答