Использование переменных вместо объектов

#vb6

#vb6

Вопрос:

Я использовал эту строку

 .RecordSource = "select * from tblpersonal where empid like '" amp; Me.lblIDNumber.Caption amp; "*'"
  

… мой вопрос в том, что, если я использую переменную ( varIDNumber ) вместо object ( lblIDNumber ), каким будет синтаксис? Я использую VB6.0

Комментарии:

1. Меня смущает lblIDNumber vs txtIDNumber . Вы используете метку или текстовое поле? Я предполагаю, что когда вы говорите, lblIDNumber.Caption вы имеете в виду txtIDNumber.Text .

2. Прошу прощения… Я имею в виду lblIDNumber

3. Тогда я немного сбит с толку — если вы извлекаете это из метки, то это не то, что пользователь может изменить. Это просто должно быть константой?

4. Потому что я ответил на вопрос, предполагая, что это текстовое поле и что вы хотели, чтобы переменная обновлялась всякий раз, когда пользователь изменяет текст. Метки используются только для отображения текста пользователю, а не для получения входных данных, так какова же цель считывания заголовка из метки?

5. Да, константа… Этот код предназначен для программы поиска .

Ответ №1:

Вы не упомянули txtIDNumber в коде — вы упомянули lblIDNumber . Я предполагаю, что вы имеете в виду, что эти два должны быть одинаковыми. Другими словами, код, который у вас есть в настоящее время, должен быть примерно таким:

 .RecordSource = "select * from tblpersonal where empid like '" amp; Me.txtIDNumber.Text amp; "*'"
  

Итак, вы используете значение текстового поля в форме для заполнения SQL-запроса. Прав ли я пока?

И вы спрашиваете, что, если я сохраню идентификационный номер в переменной, а не в текстовом поле? Я согласен, это, вероятно, шаг в правильном направлении.

Таким образом, вы могли бы создать переменную в разделе «Общие объявления» формы, используя:

 Dim idNumber As Integer
  

Идея состоит в том, чтобы обновлять значение этой переменной каждый раз, когда изменяется текстовое поле. Примечание: Я предполагаю, что «идентификационный номер» является целым числом — если нет, вам следует использовать вместо него строку.

Теперь вам нужно обновить эту переменную при изменении текстового поля. В txtIDNumber_Change случае вам захочется добавить код для преобразования строки txtIDNumber.Text в целое число и сохранить его в idNumber . Я забыл точный синтаксис, но я предполагаю что-то вроде:

 idNumber = Int(txtIDNumber.Text)
  

Наконец, теперь вы можете использовать idNumber переменную в SQL-запросе вместо текстового поля:

 .RecordSource = "select * from tblpersonal where empid like '" amp; idNumber amp; "*'"
  

Комментарии:

1. Примечание об уязвимостях SQL-инъекций: в вашем исходном коде есть проблема с безопасностью. Пользователь мог ввести в текстовое поле 4'; drop table tblpersonal; select * from tblpersonal where empid = ' — это фактически привело бы к выполнению их вредоносного кода для удаления таблиц, потому что вы не очистили строку. Преобразование его в целое число, как я предложил, решило бы эту проблему в данном конкретном случае, но если вы хотите разрешить полные строки в любом месте, исправить проблему будет намного сложнее.

2. @mgiuca … итак, каков наилучший синтаксис для этого? Я использую этот код для программы поиска .

3. Если целью кода является возможность поиска сотрудника по идентификатору, который пользователь вводит в текстовое поле, тогда у вас должно быть текстовое поле, а не метка … как я сказал в ответ на вопрос, я в замешательстве по этому поводу. Если у вас действительно есть текстовое поле, то мой ответ дает весь необходимый вам синтаксис… определите переменную, преобразуйте строку в целое число и сохраните ее в переменной, а затем используйте переменную в запросе.

Ответ №2:

Замените меня.lblIDNumber.Заголовок с переменным номером

Комментарии:

1. Я спрашиваю о синтаксисе, .RecordSource = "select * from tblpersonal where empid like '" varIDNumber "*'" правильно ли это?

2. Ну, вам все еще нужны амперсанды. Итак … where empid like '" amp; varIDNumber amp; "*'" . Но вам все еще нужен некоторый код для заполнения переменной.

Ответ №3:

Если у вас есть константа в метке и вы предпочли бы, чтобы константа вместо этого хранилась в переменной, создайте Const в коде формы. Допустим, на этикетке есть текст «43».

В разделе общих объявлений формы добавьте код:

 Const idNumber As Integer = 43
  

Затем, при построении запроса:

 .RecordSource = "select * from tblpersonal where empid like '" amp; idNumber amp; "*'"
  

При этом запрос будет сконструирован с использованием константы 43. Я действительно не вижу в этом смысла — если вы хотите, чтобы номер сотрудника был чем-то, что пользователь может ввести, смотрите Мой другой ответ.

Комментарии:

1. …не могли бы вы спросить вас? какова цель asterisk? '" amp; idNumber amp; "*'" что, если я заменю его знаком процента? Каков был бы результат?

2. Я не уверен, для чего нужен *. Я думаю, что% — это то, что вы обычно используете в качестве подстановочного знака в SQL. Это означает, что найдите любого сотрудника с идентификационным номером, который начинается с этих цифр.