首先,使用参数!
将用户提供的值直接连接到您的 SQL 语句中会暴露您的SQL 注入,无论是有意的(即用户输入他们自己的 SQL 语句来破坏您的数据库)还是无意的(例如,用户输入的值包含撇号或其他 SQL 定界符)。
相反,使用参数表示每个字段值,例如:
With CurrentDb.CreateQueryDef _
( _
"", _
"insert into " & _
"tblcases (casename, casewidth, caseheight, casecasters, caseweight, casedepth, casecategory) " & _
"values (@casename, @casewidth, @caseheight, @casecasters, @caseweight, @casedepth, @casecategory) " _
)
.Parameters("@casename") = txtNewCaseName
.Parameters("@casewidth") = txtCaseWidth
.Parameters("@caseheight") = txtCaseHeight2
.Parameters("@casecasters") = chkboxCasters
.Parameters("@caseweight") = txtCaseWeight
.Parameters("@casedepth") = txtCaseDepth
.Parameters("@casecategory") = cboCaseCategory
.Execute
End With
由于每个表单控件的值直接提供给 SQL 语句中的参数,因此该值将始终被解释为文字并且不能构成 SQL 语句本身的一部分。
此外,您不必担心用单引号或双引号将字符串值括起来,也不必担心格式化日期值 - 数据以其本机形式使用。
在涉及测试现有值的情况下,您可以使用域聚合函数,例如DLookup
,或者您可以使用 SQLselect
语句并测试没有返回记录,例如:
Dim flg As Boolean
With CurrentDb.CreateQueryDef _
( _
"", _
"select * from tblcases where " & _
"casename = @casename and " & _
"casewidth = @casewidth and " & _
"caseheight = @caseheight and " & _
"casecasters = @casecasters and " & _
"caseweight = @caseweight and " & _
"casedepth = @casedepth and " & _
"casecategory = @casecategory " _
)
.Parameters("@casename") = txtNewCaseName
.Parameters("@casewidth") = txtCaseWidth
.Parameters("@caseheight") = txtCaseHeight2
.Parameters("@casecasters") = chkboxCasters
.Parameters("@caseweight") = txtCaseWeight
.Parameters("@casedepth") = txtCaseDepth
.Parameters("@casecategory") = cboCaseCategory
With .OpenRecordset
flg = .EOF
.Close
End With
End With
If flg Then
' Add new record
Else
' Record already exists
End If
最后,您当前正在针对文字 string 测试表单控件的值,"Null"
只有当用户将值输入控件时才会验证该值Null
,而不是当控件为空白时。
相反,您应该使用 VBAIsNull
函数来检查变量是否包含 Null 值。