MS Access - SQL追加查询行为不稳定

时间:2017-09-06 16:58:37

标签: sql vba ms-access access-vba

过去几周我一直在使用Access数据库,这是我使用该工具的第一个项目。处理附加查询似乎已成为一个彻头彻尾的噩梦,令人难以置信的沮丧。更是如此,因为它似乎只是在一夜之间以任何一致的方式停止工作。

我写的SQL查询是这样的:

PARAMETERS noteDetails LongText, noteTime DateTime, srcUserID Long;
INSERT INTO tblNotes (NOTE_DETAILS, NOTE_TIME_CREATED, NOTE_SOURCE_USER)
VALUES (noteDetails, noteTime, srcUserID)

tblNotes 中:

NOTE_ID is an AutoNumber
NOTE_DETAILS is a Long Text
NOTE_TIME_CREATED is a Date/Time
NOTE_SOURCE_USER is a Number

我运行此查询的方式是通过VBA:

Set qdf = CurrentDb.QueryDefs("qerApndNote")
qdf.Parameters(0).Value = txtDetails.Value
qdf.Parameters(1).Value = Now()
qdf.Parameters(2).Value = getCurrentUserID()
qdf.Execute dbFailOnError
qdf.Close
Set qdf = Nothing

' Where CurrUserID is a global long
' txtDetails.Value is a textbox's contents
' Now() is the VBA built-in function to return a date/time combo

我试图从导航栏手动运行此查询,并且以这种方式完成后工作正常。

但是,从VBA运行它会导致没有插入时间/日期,有时没有插入用户ID,有时两者都有,有时甚至缺少详细信息文本。

我错过了什么? MS Access用户是否有任何一般性建议可以遵循我不是?我知道NOTE在Access中是一个限制词,但我真的不认为这应该适用于此,对吧?

提前致谢!

编辑:我传递数据的格式称为frmNewNote,其中有一个名为txtDetails的控件。它只是一个普通的文本框。真的不知道还有什么可以分享的。

getCurrentUserID函数位于模块中, modGlobal

Public CurrUserID As Long

Public Function getCurrentUserID() As Long
    getCurrentUserID = CurrUserID
End Function

Public Function setCurrentUserID(CurrID As Long)
    CurrUserID = CurrID
End Function

它真的是你可以得到的准系统。在您的...会话期间调用SetCurrentUserID之前,您永远不会遇到这种情况吗?有一个登录表格。

@Andre的日志记录代码:

 0            noteDetailsText             This is a note test
 1            noteTimeCreated             9/6/2017 10:28:45 AM 
 2            srcUserID      1

至于我的架构,嗯,它只是桌面上的单个数据库文件。单击按钮 btnEnter 时,将运行整个函数/ sub。它在进入SQL语句位之前做了一些其他的事情 - 检查空值并在提示用户输入条件的情况下。

2 个答案:

答案 0 :(得分:1)

我只记得一些事情:

MS Access 2013 calling insert queries from VBA with strange errors

您有一个LongText参数。这些并不真正有用。另请参阅https://stackoverflow.com/a/37052403/3820271

如果输入的备注始终为< = 255个字符,请将参数更改为ShortText

如果文本可以更长,则必须使用SunKnight0的方法和连接的INSERT语句。

或者使用Recordset及其.AddNew方法,该方法与当前解决方案的代码量相似,但也可以完全避免注入或格式化问题。

答案 1 :(得分:0)

你正在做的工作比你必须做的更多。您所需要的只是:

DoCmd.RunSQL("INSERT INTO tblNotes (NOTE_DETAILS, NOTE_TIME_CREATED, NOTE_SOURCE_USER) VALUES ('" & Me.txtDetails & "',Now()," & CurrUserID  & ")")

请注意从txtDetails.ValueMe.txtDetails的更改,这可能会让您感到烦恼。这当然假设代码在表单的上下文中运行,否则你必须使用对表单的引用来获取文本字段的值。

唯一需要考虑的是确保Me.txtDetails没有任何单引号,因此可能请改用Replace(Me.txtDetails,"'","''")

通过这种方式,您还可以将DoCmd.RunSQL替换为MsgBox,以解决确切的查询问题。

相关问题