首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在SQL查询中使用VBA组合框值返回类型不匹配

在SQL查询中使用VBA组合框值返回类型不匹配
EN

Stack Overflow用户
提问于 2018-04-27 13:33:27
回答 1查看 719关注 0票数 1

我有一个包含代理列表的用户表单。当您单击一个代理并单击一个按钮将它们标记为不在这里时,会弹出一个弹出框,要求您选择它们不在这里的原因。

此弹出窗口还包含一个框,该框应显示代理的当前考勤点数量。从存储它的SQL表中提取信息的代码如下所示。

当它运行时,我在.additem rs![Five9 Extension]行上得到一个类型不匹配错误。SQL表上的列是一个varchar,我只需要它显示一个数字,所以我不确定问题是什么。

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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,所以您要发送的查询类似于

代码语言:javascript
复制
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字符串中删除单引号并用问号替换参数连接:

代码语言:javascript
复制
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 WhileTrue,就会生成一个不进入的True循环

代码语言:javascript
复制
Do While Not rs.EOF
    '...consume recordset...
    rs.MoveNext
Loop

现在,只需要计算出selectedName。使用listbox‘ListIndex属性执行此操作:

代码语言:javascript
复制
Dim selectedName As String
With MainPage.AgentName
    Debug.Assert .MultiSelect = fmMultiSelectSingle 'wheels come off otherwise
    selectedName = .List(.ListIndex)
End With
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50063571

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档