【问题标题】:How to ignore the Null values in Insert query in access如何在访问中忽略插入查询中的 Null 值
【发布时间】:2017-01-22 16:20:40
【问题描述】:

我有一个需要使用表单更新表的数据库表。 但是,表格中的所有字段都不必强制填写。 我正在编写用于插入的以下 VB 代码但是我收到一条错误消息,指出语句中存在语法错误。据我所知,这是因为变量中的空值。我知道我需要对所有空值使用 DBNull.Value。 这里的事情是有太多的字段来检查值是否为空。 有没有人建议是否有办法对输入的值进行批量检查?

VB代码:

Dim StrSQL As String
Dim StrSQL1 As String
Dim tktID As Variant
Dim Assi As Variant
Dim reopened As Variant
Dim valid As Variant
Dim Reopenreason As Variant
Dim ReassignmentAG As Variant
Dim RBSCollab As Variant
Dim SMEconf As Variant
Dim Cloabag As Variant
Dim smeName As Variant
Dim Updat  As Variant
Dim Closed As Variant
Dim iss As Variant
Dim ana As Variant
Dim res As Variant
Dim rVariant As Variant

' Assigining values

tktID = Ticket_number.Value
reopened = Ticket_Reopened.Value
valid = Valid_Reopen.Value
Assi = Assiginee.Value
Reopenreason = Reopen_reason.Value
ReassignmentAG = Reassignment_AG.Value
RBSCollab = RBS_Collab.Value
SMEconf = CkBxSMEConfirmation.Value
Cloabag = Collabarated_AG.Value
smeName = SME_Name.Value
Updat = Update.Value
Closed = Issue_Closed.Value
iss = Issue.Value
ana = Analysis.Value
res = Resolution.Value
rdate = Resolve_date.Value

'Insert values into the tables

StrSQL = "INSERT INTO Updates (TicketID,Assiginee,ReassignmentAG,RBSCollab,CollabAG,SMEconfirmation,SMEName,Update,IssueClosed,Issue,Analysis,Resolution,ResolveDate,TicketReopened,ValidReopen,ReopenReason) VALUES ('" & tktID & "','" & Assi & "','" & ReassignmentAG & "','" & RBSCollab & "','" & Cloabag & "','" & SMEconf & "','" & smeName & "','" & Updat & "','" & Closed & "','" & iss & "','" & ana & "','" & res & "','" & rdate & "','" & reopened & "','" & valid & "','" & Reopenreason & "' ) "
DoCmd.RunSQL StrSQL

提前感谢您的帮助

【问题讨论】:

  • 最好学会使用参数来避免sql注入和格式化问题。
  • 我有很多字段,你可以。我不认为使用参数会有所帮助
  • 你误解了为什么要使用参数。考虑一下 Reopenreasonfoo'); DROP TABLE Updates; -- 会发生什么。
  • 会有帮助的。它将改进您的代码。它将防止发生意外。它会让你成为一个更好的程序员。
  • 或者您可以简单地使用绑定形式 shrug。它根本不需要任何代码,并且知道如何处理 NULL 值——对于必填字段(抛出错误)和非必填字段(将它们留空)。

标签: sql ms-access vba ms-access-2013


【解决方案1】:

我也设置了我的第一个 Access 数据库,使用大量未绑定的控件和 SQL 语句来移动数据。但这不是使用 Access 的方式。您应该使用绑定表单,其中控件会根据绑定的表/列自动知道约束是什么。

这意味着您编写(和维护)的代码要少得多,未来的开发人员可以查看您的 Access 应用程序并知道发生了什么,因为它将在 Access 范例中完成,并且如果您将尽可能多的逻辑放入表中/relationships 如果有人出现并链接到您的 ACCDB 或打开后端,他们可以输入数据而不会输入错误数据。

所以最终这是一个 XY 问题。摆脱所有这些代码(尤其是DoCmd.RunSQL)并创建一个绑定表单。将您的验证逻辑放在表中的外键、验证规则和/或数据宏中。

【讨论】:

  • 我正在使用它自己的绑定表单,并且在它映射到的表中添加详细信息没有问题但是当检查该表单中的值时,我希望将这些详细信息插入到另一个表中还有
  • @shravya 我明白了,在这种情况下,请考虑进行查询以插入这些值。运行时提示您输入内容的那种。然后通过CurrentDbQueryDefs` 集合使用该查询进行插入。返回的QueryDef 对象有一个Parameters 集合。您可以将空值添加到该/未清理的输入中。如果我有时间,我可以更新/写另一个答案。
  • 另外,您可以使用带有一些巧妙绑定的子表单。
  • 谢谢 会试试看我是否能找到另一种方法来解决这个问题
【解决方案2】:

解决这个问题的一个简单方法是在插入查询中使用之前检查元素的值,如果元素的值未定义而不是设置为 null。 在查询中将此值传递给数据库。

【讨论】:

  • 如您所见,这是我的问题,我该如何进行批量检查?
【解决方案3】:

对每个字段执行此操作:

tktID = IIF(ISNULL(Ticket_number.Value),"Null","'" & Ticket_number.Value & "'")

然后代替这个:

VALUES ('" & tktID & "',...

这样做

VALUES (" & tktID & ",...

或者如果您不介意用空字符串替换空值:

tktID = Nz(Ticket_number.Value)

会做的。

当然,你至少应该确保没有单引号在刺痛中,这样更好:

 tktID = IIF(ISNULL(Ticket_number.Value),"Null","'" & Replace(Ticket_number.Value,"'","''") & "'")

【讨论】:

    【解决方案4】:

    为 INSERT 语句构建字符串后

    strSql = "INSERT INTO tblmovimentiServizi ( msid, " _
    & " msData, msIdDestinazione, msOraInizioServizio,  msOraFineServizio, msAndataRitorno, " _
    & " msOraVincoloEntrata, msOraVincoloUscita, msidAnagraficaAutomezzi, msServizioEseguito, msNoteCommenti) " _
    & " VALUES ('" & rst!newid & "', #" & rst!msData + Me.g1 & "#, '" _
    & rst!msIdDestinazione & "', #" _
    & rst!msOraInizioServizio & "#, #" _
    & rst!msOraFineServizio & "#, '" _
    & rst!msAndataRitorno & "', #" _
    & rst!msOraVincoloEntrata & "#, #" _
    & rst!msOraVincoloUscita & "#, '" _
    & rst!msidAnagraficaAutomezzi & "', " _
    & eseguito & ", '" _
    & rst!msNoteCommenti & "'" _
    & ");"
    

    我加了

    strSql = Replace(strSql, "''", "null")
    strSql = Replace(strSql, "##", "null")
    

    它有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-21
      • 1970-01-01
      • 1970-01-01
      • 2019-09-29
      • 2019-02-16
      • 1970-01-01
      • 1970-01-01
      • 2021-09-18
      相关资源
      最近更新 更多