MS access运行SQL不插入数据,没有错误

Posted

技术标签:

【中文标题】MS access运行SQL不插入数据,没有错误【英文标题】:MS access running SQL doesn't insert data, no error 【发布时间】:2015-07-16 15:04:06 【问题描述】:

我想从表单向这个表中添加数据。

我有工作和团队 ID 的组合框,可以从各自的表中查找数据。

Private Sub save_new_Click()
On Error GoTo save_new_Click_Err

    On Error Resume Next
    Dim strSQL As String

    strSQL = "INSERT INTO Employee (Name,ATUUID,Job ID,Team ID,Start Date, Comments) " & _
     " VALUES(" & Me.Employye_Name & ", " & Me.ATTUID & ", " & Me.cboFunc & ", " & _
     Me.cboTeam & ", " & Me.Start_Date & ", " & Me.Comments & ")"
     Debug.Print strSQL
    With CurrentDb
        .Execute (strSQL), dbFailOnError
        Debug.Print .RecordsAffected
    End With

这是生成的 SQL 字符串:

 INSERT INTO Employee (Name,ATUUID,Job ID,Team ID,Start Date, Comments)  VALUES(asd, asd, 1, 2, 7/10/2015, asdasd)

Debug.Print.RecordsAffected

打印 0

【问题讨论】:

您需要用" 分隔您的字符串(或者它可能是' --- 无法记住访问权限。) 没有错误? - 不足为奇:删除On Error Resume Next 您很容易受到sql injection attacks 的攻击,这就是您的查询失败的原因。这是完全无效的。 7/10/2015 是数学除法,而不是日期。 asdasd 是字段名,不是字符串,等等等等 @AlexK.:一定要喜欢那些让你有能力说“我刚刚摧毁了整个宇宙,哦,好吧,让我们假装这没有发生”的语言 为我调试它的第一步是使用 Management Studio 在 SQL Server 上运行查询,看看它是否真的有效;正如其他人所说,我怀疑它不会。如果确实如此......然后在运行代码时在服务器上运行活动监视器,看看会发生什么(如果有的话)。 【参考方案1】:

作为@AlexK. explained,您没有看到错误的原因是On Error Resume Next 隐藏了错误。当您使用它时,您是在告诉 Access “忽略任何错误 --- 甚至不要提及它 --- 并继续下一行。”

但是代码构建的INSERT语句肯定会触发错误。如果您从即时窗口复制Debug.Print strSQL 的输出,在查询设计器中创建一个新查询,将查询切换到 SQL 视图,粘贴语句文本并尝试运行它,您可以确认这一事实。

当您有一个包含空格的字段名称时,您必须将其括在方括号中,以便数据库引擎将其识别为一个标识符而不是两个标识符。我也会将 Name 括起来,因为它是一个保留字,但我怀疑它是否真的导致了这里的问题:

"INSERT INTO Employee ([Name], ATUUID, [Job ID], [Team ID], [Start Date], Comments)"

除此之外,我建议您使用基于参数查询的临时QueryDef,提供参数值,然后Execute 它。

'On Error Resume Next '<-- leave this disabled, AT LEAST while debugging!
Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim strSQL As String

strSQL = "INSERT INTO Employee ([Name], ATUUID, [Job ID], [Team ID], [Start Date], Comments)" & vbCrLf & _
    "VALUES (pName, pATUUID, pJobID, pTeamID, pStartDate, pComments);"
Set db = CurrentDb
Set qdf = db.CreateQueryDef(vbNullString, strSQL)
With qdf
    .Parameters("pName").Value = Me.Employye_Name.Value
    .Parameters("pATUUID").Value = Me.ATTUID.Value
    .Parameters("pJobID").Value = Me.cboFunc.Value
    .Parameters("pTeamID").Value = Me.cboTeam.Value
    .Parameters("pStartDate").Value = Me.Start_Date.Value
    .Parameters("pComments").Value = Me.Comments.Value
    .Execute dbFailOnError
End With
Debug.Print db.RecordsAffected

【讨论】:

感谢这解决了这个问题,我也搞砸了 ATUUID,它是 ATTUID :D

以上是关于MS access运行SQL不插入数据,没有错误的主要内容,如果未能解决你的问题,请参考以下文章

MS Access UPSERT(更新/插入)SQL [重复]

MS Access:使用 VBA 进行 SQL 插入的日期格式

带有子查询的 SQL 查询上的 MS Access VBA 运行时错误 3075

MS Access 使用 SQL INSERT INTO - SELECT FROM 插入记录

更新查询的 MS Access SQL 错误

Ms Access SQL 更新语句不起作用