2016-09-14 57 views
-2

我有数据库表需要使用表单进行更新。 但是,表格中的所有字段都不必强制填写。 我正在写下面的VB代码插入然而,我得到一个错误,说明在语句中有语法错误。据我所知,这是因为变量中的空值。我知道我需要为所有的空值使用DBNull.Value。 这里的事情是有太多的字段来检查值是否为空。 任何机构都建议是否有办法对输入值为空的值进行批量检查?如何在插入查询中忽略访问中的空值

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 

在此先感谢您的帮助

+1

最好学会使用参数来避免sql注入和格式化问题。 – LarsTech

+0

我有很多字段,你可以。我不使用参数将有助于 – shravya

+0

你误解了你会使用参数的原因。考虑一下'foo'的'Reopenreason'会发生什么) DROP TABLE更新; - '。 – Comintern

回答

0

一个简单的解决这个问题,可以使用插图查询,如果之前只检查元素的值元素的值高于设定未定义与null。 将此值传递给查询中的数据库。

+0

正如你所见,这是我的问题我如何做这个质量检查? – shravya

0

这样做对每个字段:

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,"'","''") & "'") 
2

我也一样,使用大量未绑定的控件和SQL语句的用于移动安装我的第一个访问数据库周围的数据。但这不是使用Access的方式。您应该使用绑定表单,其中控件根据绑定的表/列自动知道约束条件。

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

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

+0

我正在使用绑定窗体它自己并没有任何问题添加它映射到的表中的详细信息但是,当该窗体中的值被选中时我希望这些详细信息被插入到另一个表中 – shravya

+0

@shravya我看到在这种情况下,请考虑进行查询以插入这些值。那种在你运行时会提示你输入的东西。然后通过'CurrentDb'QueryDefs'集合使用该查询来执行插入操作。返回的QueryDef对象有一个'Parameters'集合。你可以添加你的空值到那个/ unsanitized输入。如果我有一些时间,我可以更新/写另一个答案。 – Brad

+0

或者,您可以使用具有某种巧妙绑定的子表单。 – Brad