Sql 如何在access中忽略插入查询中的空值

Sql 如何在access中忽略插入查询中的空值,sql,ms-access,vba,ms-access-2013,Sql,Ms Access,Vba,Ms Access 2013,我有一个数据库表,需要使用表单更新该表。 但是,表格中的所有字段不必强制填写。 我正在编写下面的VB代码进行插入,但是我得到一个错误,指出语句中存在语法错误。据我所知,这是因为变量中的空值。我知道我需要对所有空值使用DBNull.Value。 这里的问题是有太多的字段要检查值是否为null。 有没有人建议是否有办法对输入为空的值进行批量检查 VBCode: Dim StrSQL As String Dim StrSQL1 As String Dim tktID As Variant Dim As

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

VBCode:

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

提前感谢您的帮助

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

对每个字段执行此操作:

tktID = IIF(ISNULL(Ticket_number.Value),"Null","'" & Ticket_number.Value & "'")
然后,与此相反:

VALUES ('" & tktID & "',...
这样做

VALUES (" & tktID & ",...
或者,如果您不介意将空字符串替换为空字符串:

tktID = Nz(Ticket_number.Value)
我会的

当然,您至少应该确保stings中没有单引号,因此更好的做法是:

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

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

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


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

构建插入桩的桩柱后

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")

它是有效的。

最好学会使用参数,以避免sql注入和格式问题。我有很多字段,你可以。我不认为使用参数会帮助你误解使用参数的原因。考虑一下<代码> >重新开放的原因<代码> >代码>删除表格更新--。这会有帮助。它将改进您的代码。它将防止灾难。它会让你成为一个更好的程序员,或者你可以简单地用一个固定的耸肩。它根本不需要代码,并且知道如何处理空值——必填字段(抛出错误)和非必填字段(保留为空)。如您所见,这是我的问题,我如何对此进行批量检查?我使用的是绑定表单,并且在映射到的表中添加详细信息没有问题。但是,当选中该表单中的值时,我希望将这些详细信息插入另一个表中well@shravya我懂了,在这种情况下,请考虑进行查询以插入这些值。运行时提示您输入内容的类型。然后通过
CurrentDb
querydfs`集合使用该查询进行插入。返回的
QueryDef
对象具有
Parameters
集合。您可以将空值添加到该/未初始化的输入中。如果我有时间,我可以更新/写另一个答案。或者,你可以使用一个带有一些巧妙绑定的子表单。谢谢你,我会尝试的。我也会等着看我是否能找到其他方法来解决这个问题