簡體   English   中英

使用SQL Server后端更新的MS Access失敗,沒有錯誤

[英]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。

為什么我的初始陳述無聲地失敗? 謝謝!


更多測試證實了我以前的發現:

  1. 創建了一個新的Access數據庫,表庫存:ID(自動編號,PK),NumberOfBlocks(整數),BlocksReserved(整數),LastUser(短文本10)
  2. 在SQL Server中創建一個表:

    [ID] [int] IDENTITY(1,1)NOT NULL,[NumberOfBlocks] [smallint] NULL,[BlocksReserved] [smallint] NULL,[LastUser] nvarchar NULL,[RV] [timestamp] NOT NULL

  3. 將ID設置為主鍵,鏈接SQL表,在兩者中輸入測試數據。

  4. 在兩個表上運行完全相同的代碼(僅更改了表名):

    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'


更多說明:

  • 將SQL Server中的數據類型更改為int(而不是smallint)並沒有什么區別。
  • 但是,顯式轉換字段工作:

    ... SET NumberOfBlocks = CInt(BlocksReserved)...

  • 就像

    ... SET NumberOfBlocks =(BlocksReserved * 1)...

我想,這會把我的帖子從一個問題變成一個單挑......

進一步測試證實,在以下條件下,這是執行命令中的錯誤:

  • 它是一個UPDATE語句,其中一個整數字段分配給另一個整數字段,例如SET FieldA = FieldB (相同的數值數據類型)
  • 它是SQL Server中的鏈接表。

相同的SQL語句可以正常工作

  • 在Access或中使用表
  • 在查詢中使用時。

經過測試的解決方法:

  • 顯式轉換字段:SET FieldA = CInt(FieldB)...(或CLng ...)
  • 使用任何計算:SET FieldA = FieldB * 1
  • 使用變量:SET FieldA =“&intFieldB

這非常有趣。 我可以使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM