我有一个包含代理列表的用户表单。当您单击一个代理并单击一个按钮将它们标记为不在这里时,会弹出一个弹出框,要求您选择它们不在这里的原因。
此弹出窗口还包含一个框,该框应显示代理的当前考勤点数量。从存储它的SQL表中提取信息的代码如下所示。
当它运行时,我在.additem rs![Five9 Extension]行上得到一个类型不匹配错误。SQL表上的列是一个varchar,我只需要它显示一个数字,所以我不确定问题是什么。
Dim Cn As ADODB.Connection
Dim Server_Name As String
Dim Database_Name As String
Dim SQLStr As String
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
Server_Name = "SDL02-VM25"
Database_Name = "PIA"
SQLStr = "select [Five9 Extension] from dbo.[Master Staffing List] Where [Agent Name] ='" & MainPage.AgentName.Selected(itemIndex) & "'"
Set Cn = New ADODB.Connection
Cn.Open "Driver={SQL Server};Server=" & Server_Name & ";Database=" & Database_Name & ""
rs.Open SQLStr, Cn, adOpenStatic
With ReasonPopup.CurPoints
.Clear
Do
.AddItem rs![Five9 Extension]
rst.MoveNext
Loop Until rst.EOF
End With
rs.Close
Cn.Close
Set rs = Nothing
Set Cn = Nothing
Exit Sub发布于 2018-04-27 14:10:45
除了for运算符隐式默认成员调用(rs![Field Name]是rs.Fields("Field Name").Value的缩写),查询似乎没有返回您认为它所做的事情:
SQLStr =“从dbo.Master人员配置列表中选择Five9扩展,其中代理名称=‘& MainPage.AgentName.Selected(itemIndex) &’”
ListBox.Selected(index)返回一个Boolean,所以您要发送的查询类似于
select [Five9 Extension] from dbo.[Master Staffing List] Where [Agent Name] ='True'....Which --我期望产生总计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是True,就会生成一个不进入的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 Withhttps://stackoverflow.com/questions/50063571
复制相似问题