簡體   English   中英

MS Access 2013調用來自VBA的插入查詢,出現奇怪的錯誤

[英]MS Access 2013 calling insert queries from VBA with strange errors

我有一個保存的插入查詢,將記錄添加到表中。 查詢的參數來自未綁定形式。 該表中的2個字段為yes / no數據類型。 這些字段的表單控件是一個復選框。

這是保存的查詢“ qryInsertLog”

PARAMETERS UserPar Text ( 255 ), ApprovedByPar Text ( 255 ), CCedByPar Text ( 255 ), 
           UnitIdPar Short, NotePar LongText, Z3Par Bit, Z5Par Bit, FollowupNotesPar LongText;

INSERT INTO tblLogBook ( [User], ApprovedBy, CCedBy, UnitID, Notes, Z3, Z5, FollowupNotes )

SELECT [UserPAR] AS Expr1, [ApprovedByPar] AS Expr2, [CCedByPar] AS Expr3, 
       [UnitIDPar] AS Expr4, [NotePar] AS Expr5, [Z3Par] AS Expr6, [Z5Par] AS Expr7, 
       [FollowupNotesPar] AS Expr10;

這是我的VBA代碼,與我的表單上的保存按鈕綁定在一起:

Private Sub cmdSaveandNew_Click()

Dim db As DAO.Database
Dim qdf1 As DAO.QueryDef

Set db = CurrentDb
Set qdf1 = db.QueryDefs("qryInsertLog")

'put form parameters into insert query
qdf1.Parameters(0).Value = Me.cboUser.Value
qdf1.Parameters(1).Value = Me.cboApprover.Value
qdf1.Parameters(2).Value = Me.cboCCer.Value
qdf1.Parameters(3).Value = Me.cboUnit.Value
qdf1.Parameters(4).Value = Me.txtNotes.Value
qdf1.Parameters(5).Value = Me.chkZ3.Value
qdf1.Parameters(6).Value = Me.chkz5.Value
qdf1.Parameters(7).Value = Me.txtFollowup.Value

qdf1.Execute

Set qdf1 = Nothing
Call resetForm

End Sub

“ resetForm”是一個例程,僅將表單控件返回其默認值。

當我按下“保存”按鈕時,有時會添加記錄,但沒有獲得Me.chkZ3.Value和Me.chkZ5.Value的正確值(這意味着如果我選中了它們,則記錄會以這些值作為false輸入)。 幾次點擊保存按鈕后,我開始出現以下錯誤:

Run-time error '3000':

Reserved error (-3033); there is no message for this error.

但是,與此有關的最有趣的部分是,當我將查詢修改為僅包含1是/否字段時,我沒有收到任何錯誤,並且記錄已正確更新。

這里到底發生了什么?

編輯:我忘了提一下,當我從“訪問對象”窗口(而不是VBA)運行查詢時,它完全可以正常工作。

問題是LongText參數。 我嘗試了類似的查詢:

PARAMETERS pText1 Text ( 255 ), pInt1 Short, pMemo1 LongText, pYesno1 Bit, pYesno2 Bit;
INSERT INTO ForInsert ( text1, int1, Memo1, yesno1, yesno2 )
SELECT [pText1] AS A1, [pInt1] AS A2, [pMemo1] AS A3, [pYesno1] AS A4, [pYesno2] AS A5;

用這個代碼

Set db = CurrentDb
Set qdf1 = db.QueryDefs("qAppForInsert")

qdf1.Parameters(0).Value = "asdf"
qdf1.Parameters(1).Value = 77
qdf1.Parameters(2).Value = String(3, "a")
qdf1.Parameters(3).Value = True
qdf1.Parameters(4).Value = False

qdf1.Execute

以及LongText參數的各種長度(2,10,3)。

導致出現這種瘋狂的數據(“是/否”字段始終為yesno1 = Trueyesno2 = False !):

+----+-------+------+------------+--------+--------+
| ID | text1 | int1 |   Memo1    | yesno1 | yesno2 |
+----+-------+------+------------+--------+--------+
|  8 | asdf  |   77 | aa         | True   | False  |
|  9 | asdf  |   77 | aaaaaaaaaa | False  | False  |
| 10 | asdf  |   77 | aaa        | False  | True   |
+----+-------+------+------------+--------+--------+

因此,顯然使用LongText參數,最好使用RecordSet.AddNew而不是參數化查詢。

無論如何,參數限制為255個字符

附錄

如果我在循環中運行代碼以找到系統,則還會收到Reserved error (-3033)

在將它們分配給表之前,您可能應該在表單字段中添加更多錯誤跟蹤和檢查Null值。 如此一來,此修復程序可能會解決您的直接問題。

我假設您的Z3和Z5字段是位字段-看到這就是您聲明匹配參數類型的方式。

如果是這樣,您可能應該捕獲Null復選框並將true(-1)轉換為1

' Set to 0 if checkbox is Null, Set to 1 if checked=true
' Bit fields can't take -1 values
qdf1.Parameters(5).Value = IIf(Nz(Me.chkZ3.Value, 0), 1, 0)
qdf1.Parameters(6).Value = IIf(Nz(Me.chkz5.Value, 0), 1, 0)

附帶一提,我還建議使用命名參數而不是數字索引,以防更改它們的順序-並提高可讀性和將來的維護難度

代替

qdf1.Parameters(0).Value = Me.cboUser.Value

采用

qdf1.Parameters("UserPar").Value = Me.cboUser.Value

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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