Оператор Bang неявных вызовов членов по умолчанию в стороне (rs![Field Name]
является сокращением для rs.Fields("Field Name").Value
), кажется, что запрос не возвращает то, что, как вы думаете, он делает:
SQLStr = "select [Five9 Extension] from dbo.[Master Staffing List] Where [Agent Name] ='" & MainPage.AgentName.Selected(itemIndex) & "'"
ListBox.Selected(index)
возвращает Boolean
, поэтому отправляемый вами запрос выглядит примерно так:
select [Five9 Extension] from dbo.[Master Staffing List] Where [Agent Name] ='True'
.... Что, как я ожидаю, даст в итоге 0 строк.
Вопрос: что произойдет, если [Agent Name]
будет Jake O'Neil
? Правильно, синтаксическая ошибка с запросом. А что если [Agent Name]
будет Robert'; DROP TABLE [Master Staffing List];--
? Правильно, очень плохие вещи . Это называется уязвимость SQL-инъекций , и она преследует код запросов к базе данных по всему миру, когда люди объединяют предложения WHERE с пользовательскими данными. Это не только вопрос безопасности базы данных, но и причина легко устраняемых ошибок.
Давайте исправим это. Используйте ADODB.Command
, и в строке SQL удалите одинарные кавычки и замените конкатенацию параметров знаком вопроса:
Dim cmd As ADODB.Command
Set cmd = New ADODB.Command
Set cmd.ActiveConnection = Cn
cmd.CommandText = "SELECT [Five9 Extension] FROM dbo.[Master StaffingList] WHERE [Agent Name] = ?"
cmd.CommandType = adCmdText
cmd.Parameters.Append cmd.CreateParameter(Type:=adVarChar, Value:=selectedName)
Set rs = cmd.Execute
Теперь для использования набора записей вы не можете предполагать, что будут строки - поэтому вы создаете цикл Do While
, который не входит, если rs.EOF
равен True
:
Do While Not rs.EOF
'...consume recordset...
rs.MoveNext
Loop
Теперь нужно вычислить только selectedName
. Для этого используйте свойство listbox 'ListIndex
:
Dim selectedName As String
With MainPage.AgentName
Debug.Assert .MultiSelect = fmMultiSelectSingle 'wheels come off otherwise
selectedName = .List(.ListIndex)
End With