过去几周我一直在使用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语句位之前做了一些其他的事情 - 检查空值并在提示用户输入条件的情况下。
答案 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.Value
到Me.txtDetails
的更改,这可能会让您感到烦恼。这当然假设代码在表单的上下文中运行,否则你必须使用对表单的引用来获取文本字段的值。
唯一需要考虑的是确保Me.txtDetails
没有任何单引号,因此可能请改用Replace(Me.txtDetails,"'","''")
。
通过这种方式,您还可以将DoCmd.RunSQL
替换为MsgBox
,以解决确切的查询问题。