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

MS Access-SQL追加查询行为不稳定,sql,ms-access,vba,Sql,Ms Access,Vba,在过去的几周里,我一直在开发Access数据库,这是我使用该工具的第一个项目。处理追加查询似乎成了一场彻头彻尾的噩梦,令人难以置信地沮丧。更重要的是,它似乎一夜之间就停止了任何持续的工作 我编写的SQL查询是这样的: 参数noteDetails LongText、noteTime DateTime、srcUserID Long; 插入tblNotes(注释\u详细信息、注释\u创建时间、注释\u来源\u用户) 值(noteDetails、noteTime、srcUserID) 在tblNote

在过去的几周里,我一直在开发Access数据库,这是我使用该工具的第一个项目。处理追加查询似乎成了一场彻头彻尾的噩梦,令人难以置信地沮丧。更重要的是,它似乎一夜之间就停止了任何持续的工作

我编写的SQL查询是这样的:

参数noteDetails LongText、noteTime DateTime、srcUserID Long;
插入tblNotes(注释\u详细信息、注释\u创建时间、注释\u来源\u用户)
值(noteDetails、noteTime、srcUserID)
在tblNotes中:

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

Set qdf=CurrentDb.querydfs(“qerapndtote”)
qdf.Parameters(0).Value=txtDetails.Value
qdf.Parameters(1).Value=Now()
参数(2).Value=getCurrentUserID()
qdf.executedbfailonerror
关闭
设置qdf=无
'其中CurrUserID是一个全局长
'txtDetails.Value是文本框的内容
'Now()是VBA内置函数,用于返回日期/时间组合
我曾尝试从导航栏手动运行此查询,以这种方式运行时效果良好

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

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

提前谢谢

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

getCurrentUserID函数位于模块modGlobal中:

这是你能得到的最基本的东西,真的。而且在任何情况下,您都不会在调用SetCurrentUserID之前进入表单,在您的。。。一场这涉及到一个登录表单

@Andre的日志代码:

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

至于我的架构,嗯,它现在只是桌面上的一个数据库文件。当您单击按钮b输入时,整个功能/子功能将运行。在到达SQL语句位之前,它会执行一些其他操作—检查空值并在出现这种情况时提示用户输入条目。

您所做的工作比您必须做的多得多。您所需要的只是:

DoCmd.RunSQL("INSERT INTO tblNotes (NOTE_DETAILS, NOTE_TIME_CREATED, NOTE_SOURCE_USER) VALUES ('" & Me.txtDetails & "',Now()," & CurrUserID  & ")")
请注意从
txtdestails.Value
Me.txtdestails
的更改,这可能会让您感到困惑。当然,这假定代码在表单的上下文中运行,否则必须使用对表单的引用来获取文本字段的值

唯一要考虑的事情是确保<代码> ME。TXTDebug < /代码>没有任何单引号,因此可能使用<代码>替换(M.TxT详细)、“”、“‘’”/<代码>。


这样,您还可以将
DoCmd.RunSQL
替换为
MsgBox
,以便对精确的查询进行故障排除。

我刚刚想起一件事:

您有一个
LongText
参数。这些真的不管用。另见


如果输入的注释总是很好,您不会显示连接到数据库或关闭数据库连接,因此我猜这些部分可能有问题。也许可以尝试
Set cdb=CurrentDb
后跟
Set qdf=cdb.querydfs(“qerApndNote”)
我的另一个建议是更改例程以进行一些日志记录——记录调用前的值,记录调用后的值,包括时间戳。谜团将被揭开。这是一个很长的机会,但是试着通过名称而不是索引来处理参数
qdf.Parameters(“noteDetails”).Value=txtDetails.Value
etc.仍然没有填入用户ID或日期时间列,尽管我还是要感谢大家的帮助。从我之前阅读和了解的所有内容来看,这并不是最好的做法。按照我的方式,我实际上可以在字符串中使用单引号,因为查询是参数化的。至少,我认为这是它的要点。我使用
Me添加了更多的变化。
。至于最佳实践,这实际上取决于您的环境和系统的开放性。在大多数情况下,当只处理Access UI而不是面向Internet的应用程序时,仅使用replace来处理单引号会使工作更轻松,尤其是当代码生成的查询更复杂时。我通常会创建一个简短的函数,将其称为
Qs
,以处理单引号问题,使代码更具可读性。
 0            noteDetailsText             This is a note test
 1            noteTimeCreated             9/6/2017 10:28:45 AM 
 2            srcUserID      1
DoCmd.RunSQL("INSERT INTO tblNotes (NOTE_DETAILS, NOTE_TIME_CREATED, NOTE_SOURCE_USER) VALUES ('" & Me.txtDetails & "',Now()," & CurrUserID  & ")")