Во-первых, используйте параметры !
Объединяя значения, предоставленные пользователем непосредственно в ваш оператор 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
, или вы можете использовать оператор SQL select
и проверить, что записи не возвращены, например:
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
Наконец, вы В настоящее время вы проверяете значения элементов управления формы на соответствие буквенной строке "Null"
, которая будет проверяться только в том случае, если пользователь ввел значение Null
в элемент управления, а не в том случае, если элемент управления пуст.
Вместо этого вы должны использовать функцию VBA IsNull
, чтобы проверить, содержит ли переменная значение Null.