SQL Инъекция из текстового поля - PullRequest
1 голос
/ 17 июня 2020

Я новичок в MS Access.

Итак, я написал запрос SQL (имя запроса = qryEmployeeInfo), который показывает информацию о сотрудниках. Запрос выводит два столбца. Идентификатор сотрудника (имя заголовка = идентификатор сотрудника) и соответствующий адрес сотрудника (имя заголовка = адрес сотрудника).

Форма My Access имеет текстовое поле (имя текстового поля = txtEmployeeID), которое я хочу, чтобы пользователь мог введите идентификатор сотрудника и попросите его вывести соответствующий адрес сотрудника в другое текстовое поле (имя текстового поля = txtEmployeeAddress). Я также хочу, чтобы employee_address был в формате строковой переменной, чтобы я мог позже выполнять другие проверки VBA (например, если LIKE "California" THEN ... что-то).

Я хочу написать то, что (я думаю) называется запросом инъекции SQL, чтобы я мог извлечь адресные данные из запроса для этого c employee_ID. Я считаю, что формат должен выглядеть так:

Dim rs As Recordset
Set rs = CurrentDb.OpenRecordset("select employee_address from qryEmployeeInfo where employee_ID = "' & txtEmployeeID & "'", dbOpenDynaset)

Правильно ли я написал?

Если да, то как мне получить этот вывод в формате строковой переменной (имя переменной = strEmployeeAddress)?

После того, как я получу адрес сотрудника в формате строковой переменной, я хочу просто использовать txtEmployeeAddress.value = strEmployeeAddress для заполнения текстового поля адреса сотрудника. Опять же, я также хочу, чтобы employee_address был в формате строковой переменной, чтобы я мог выполнять другие проверки VBA позже (например, если LIKE "California" THEN ... что-то).

Любая помощь, которую вы могли бы оказать, была бы принята с благодарностью.

1 Ответ

0 голосов
/ 17 июня 2020

Если employee_ID является числовым полем, удалите разделители апострофов.

Если employee_ID является текстовым полем, переместите первый апостроф так, чтобы он находился в кавычках.
"select employee_address from qryEmployeeInfo where employee_ID = '" & txtEmployeeID & "'"

Затем txtEmployeeAddress = rs!employee_address

Однако вместо открытия объекта набора записей можно просто использовать DLookup.
txtEmployeeAddress = DLookup("employee_address", "qryEmployeeInfo", "employee_ID =" & txtEmployeeID)

Или, что еще лучше, исключить VBA. Выражение DLookup () может находиться в свойстве ControlSource текстового поля, просто перед знаком =.

Однако агрегатные функции домена могут выполняться медленно. Поэтому вместо текстового поля используйте поле со списком для выбора сотрудника. Включите информацию о сотрудниках в поле со списком RowSource. Выражение в текстовом поле ссылается на столбец поля со списком: =combobox.Column(1). Проблема в том, что поле со списком имеет ограничение на количество символов, которые можно вставить в столбец, поэтому, если поле имеет тип memo (длинный текст), этот подход неосуществим и должен использовать DLookup.

Адрес будет доступен в текстовом поле для использования пока эта форма открыта. Если вы хотите, чтобы адрес был доступен другим процедурам даже после закрытия формы, необходимо установить глобальную переменную или переменную publi c. Такая переменная должна быть объявлена ​​в заголовке модуля, чтобы сделать ее доступной для нескольких процедур. TempVars - еще один способ сохранить значения для будущего использования. Я никогда ими не пользовался.

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