Циклическая таблица, чтобы найти значение из текстового поля - PullRequest
0 голосов
/ 06 марта 2020

Я пытаюсь провести l oop через столбец внутри таблицы из формы в Access, чтобы выяснить, существует ли «Имя случая» или нет, а если нет, то добавить новую запись в Таблица. Я хочу, чтобы критерии основывались на входном значении текстового поля. Хорошей новостью является то, что я выяснил, как добавить новую запись в таблицу с помощью кода ниже. Я просто застрял на том, как l oop через таблицу, чтобы выяснить, существует ли уже запись. Заранее спасибо!

Private Sub SaveNewCase_Click()

If Me.txtNewCaseName.Value <> "Null" And Me.txtCaseDepth.Value <> "Null" And Me.txtCaseHeight2.Value <> "Null" And Me.txtCaseWeight.Value <> "Null" And Me.txtCaseWidth <> "Null" And Me.cboCaseCategory.Value <> "Null" Then
    'I think the loop should go here, but not sure'
    CurrentDb.Execute "INSERT INTO tblCases(CaseName, CaseWidth, CaseHeight, CaseCasters, CaseWeight, CaseDepth, CaseCategory) " & _
        " VALUES ('" & Me.txtNewCaseName & "'," & Me.txtCaseWidth & "," & Me.txtCaseHeight2 & ",'" & Me.chkboxCasters & "'," & Me.txtCaseWeight & "," & Me.txtCaseDepth & ",'" & Me.cboCaseCategory & "')"
Else
    MsgBox "Please enter all new case criteria."
End If

End Sub

1 Ответ

1 голос
/ 06 марта 2020

Во-первых, используйте параметры !

Объединяя значения, предоставленные пользователем непосредственно в ваш оператор 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...