[英]MS Access with SQL Server back-end update fails without error
這個簡單的VBA語句不能按預期工作:
strSQl = "UPDATE Inventory SET NumberOfBlocks = BlocksReserved, LastUser = 'Me' WHERE InventoryID = 1234;"
CurrentDb.Execute strSQl, dbFailOnError + dbSeeChanges
LastUser已更新,但NumberOfBlocks保持不變,沒有錯誤。
如果我在SSMS中運行此語句或作為Access查詢,它可以工作。
如果我在VBA語句中使用變量...“SET NumberOfBlocks =”&intBlocksReserved&“,...,它可以工作。
常量工作:......“SET NumberOfBlocks = 555”......
這個也適用 :NumberOfBlocks =(BlocksReserved * 1)
NumberOfBlocks和BlocksReserved都是smallint而不是null; 該記錄有一個時間戳/ rowversion字段。
環境:使用SQL 2016后端訪問2016。
為什么我的初始陳述無聲地失敗? 謝謝!
更多測試證實了我以前的發現:
在SQL Server中創建一個表:
[ID] [int] IDENTITY(1,1)NOT NULL,[NumberOfBlocks] [smallint] NULL,[BlocksReserved] [smallint] NULL,[LastUser] nvarchar NULL,[RV] [timestamp] NOT NULL
將ID設置為主鍵,鏈接SQL表,在兩者中輸入測試數據。
在兩個表上運行完全相同的代碼(僅更改了表名):
Dim strSQl As String
strSQl =“UPDATE Inventory SET NumberOfBlocks = BlocksReserved,LastUser ='Me';” CurrentDb.Execute strSQl,dbFailOnError + dbSeeChanges
結果:
本地訪問表:NumberOfBlocks = BlocksReserved,LastUser ='Me'
鏈接的SQL表:NumberOfBlocks不變,LastUser ='Me'
更多說明:
但是,顯式轉換字段工作:
... SET NumberOfBlocks = CInt(BlocksReserved)...
就像
... SET NumberOfBlocks =(BlocksReserved * 1)...
我想,這會把我的帖子從一個問題變成一個單挑......
進一步測試證實,在以下條件下,這是執行命令中的錯誤:
相同的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 |
+----+-----------+-----------+-----------+-----------+-----------------+
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.