【发布时间】:2017-09-06 16:58:37
【问题描述】:
过去几周我一直在研究 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 时,将运行整个函数/子程序。它在到达 SQL 语句位之前会做一些其他的事情——检查空值并提示用户输入条目。
【问题讨论】:
-
你没有显示连接到数据库或关闭数据库连接,所以我猜这些部分有问题。
-
或许可以试试
Set cdb = CurrentDb,然后是Set qdf = cdb.QueryDefs("qerApndNote") -
我的另一个建议是更改例程以进行一些日志记录——在调用之前记录值,在调用之后记录值,包括时间戳。谜底即将揭晓。
-
有点长镜头,但尝试按名称而不是索引来寻址参数。
qdf.Parameters("noteDetails").Value = txtDetails.Value等 -
仍然没有填写用户 ID 或日期时间列,不过还是感谢大家的帮助。