这个简单的VBA语句不能按预期工作:
strSQl = "UPDATE Inventory SET NumberOfBlocks = BlocksReserved, LastUser = 'Me' WHERE InventoryID = 1234;"
CurrentDb.Execute strSQl, dbFailOnError + dbSeeChanges
LastUser已更新,但NumberOfBlocks保持不变,没有错误。
如果我在SSMS中运行此语句或作为Access查询,它可以工作。
如果我在VBA语句中使用一个变量...“SET Number of Blocks =”和unBlocks Reserved&“,......,它可以工作。
常量工作:......“SET NumberOfBlocks = 555”......
这个也适用:NumberOfBlocks =(BlocksReserved * 1)
NumberOfBlocks和BlocksReserved都是smallint而不是null;该记录有一个时间戳/ rowversion字段。
环境:使用SQL 2016后端访问2016。
为什么我的初始陈述无声地失败?谢谢!
更多测试证实了我以前的发现:
结果:
本地访问表:NumberOfBlocks = BlocksReserved,LastUser ='Me'
链接的SQL表:NumberOfBlocks不变,LastUser ='Me'
更多说明:
我想,这会把我的帖子从一个问题变成一个单挑......
进一步测试证实,在以下条件下,这是执行命令中的错误:
相同的SQL语句可以正常工作
经过测试的解决方法:
这非常有趣。我可以使用Access 2010,SQL Server 2008 R2,SQL Server的ODBC驱动程序17重现它。
但只有在(n)VARCHAR列包含在UPDATE
查询中时!
UPDATE AAA SET Smallint2 = Smallint1, Int2 = Int1;
的作品。
CREATE TABLE AAA (
ID int IDENTITY(1,1) NOT NULL,
Smallint1 SMALLINT NULL,
Smallint2 SMALLINT NULL,
Int1 INT NULL,
Int2 INT NULL,
foo NVARCHAR(255) NULL,
RV TIMESTAMP NOT NULL,
CONSTRAINT PK_AAA PRIMARY KEY (ID)
)
GO
INSERT AAA (Smallint1, Smallint2, Int1, Int2, foo)
VALUES (1, 0, 77, 9999, 'asdf'),
(3456, NULL, NULL, 1234, 'null')
访问VBA:
Sub TestAAA()
Dim strSql As String
strSql = "UPDATE AAA SET Smallint2 = Smallint1, Int2 = Int1;"
CurrentDb.Execute strSql, dbFailOnError + dbSeeChanges
Stop
' Requery table => UPDATE was successful!
' Edit and save values in Smallint1 / Int1
strSql = "UPDATE AAA SET Smallint2 = Smallint1, Int2 = Int1, foo = 'with NVARCHAR';"
CurrentDb.Execute strSql, dbFailOnError + dbSeeChanges
Stop
' Requery => Smallint2 / Int2 are not updated, "foo" is!
strSql = "UPDATE AAA SET Smallint2 = CInt(Smallint1), Int2 = CLng(Int1), foo = 'with Conversion';"
CurrentDb.Execute strSql, dbFailOnError + dbSeeChanges
' Requery => Smallint2 / Int2 are updated!
End Sub
结果:
+----+-----------+-----------+-----------+-----------+-----------------+
| ID | Smallint1 | Smallint2 | Int1 | Int2 | foo |
+----+-----------+-----------+-----------+-----------+-----------------+
| 1 | 1 | 0 | 77 | 9999 | asdf |
| 2 | 3456 | | | 1234 | null |
| | | | | | |
| ID | Smallint1 | Smallint2 | Int1 | Int2 | foo |
| 1 | 1 | 1 | 77 | 77 | asdf |
| 2 | 3456 | 3456 | | | null |
| | | | | | |
| ID | Smallint1 | Smallint2 | Int1 | Int2 | foo |
| 1 | 222 | 1 | 988888888 | 77 | with NVARCHAR |
| 2 | 333 | 3456 | 999999999 | | with NVARCHAR |
| | | | | | |
| ID | Smallint1 | Smallint2 | Int1 | Int2 | foo |
| 1 | 222 | 222 | 988888888 | 988888888 | with Conversion |
| 2 | 333 | 333 | 999999999 | 999999999 | with Conversion |
+----+-----------+-----------+-----------+-----------+-----------------+