【发布时间】:2015-08-12 02:33:26
【问题描述】:
在过去的几天里,我一直在努力寻找,并且遇到了许多示例,这些示例概述了我正在尝试做的事情。但是,我似乎无法让这个工作。我有一个组合框,它在表单初始化时从表中填充数据(公司名称)。然后,我想获取在组合框中选择的值并运行另一个查询来交叉引用同一个表中的 ID 号。
Private Sub CommandButton1_Click()
Dim myCn As MyServer
Set myCn = New MyServer
Dim rs As ADODB.recordset
Set rs = New ADODB.recordset
Dim sqlStr As String
Dim CompField As String
'CompField = ComboBox1.Value
sqlStr = "SELECT DISTINCT [acctno] FROM client WHERE [company] = '" & ComboBox1.Text & "'"
'sqlStr = "Select DISTINCT [company] FROM client;"
' sqlStr = "SELECT DISTINCT [acctno] FROM client WHERE [company] = " & UserForm1.ComboBox1.Value & ";"
'sqlStr = "SELECT DISTINCT [acctno] FROM client WHERE [company] = " & UserForm1.ComboBox1.Text & ";"
'sqlStr = "SELECT DISTINCT [acctno] FROM client WHERE [company] = 'Company XYZ';"
'sqlStr = "SELECT DISTINCT [acctno] FROM client WHERE company = " & CompField & ""
rs.Open sqlStr, myCn.GetConnection, adLockOptimistic, adCmdText
MsgBox sqlStr
'MsgBox ComboBox1.Value
'MsgBox rs(0)
rs.Close
myCn.Shutdown
Set rs = Nothing
Set myCn = Nothing
End Sub
当前使用单引号括起来的组合框值,我得到了返回的整个 sql 字符串。如果我删除单引号,我会收到引用组合框值部分的语法错误。所有其他努力都导致了运行时错误,这让我无处可去。
我知道我的查询有效,因为我已经在 SQL Studio 中对其进行了测试,如果我在此代码中硬编码文本值,我也会得到我正在寻找的帐户 ID。不知道我在这里缺少什么。
【问题讨论】:
-
您需要阅读有关 sql 注入的信息。您的查询是如何不编写查询的教科书示例。您永远不应该直接执行从用户输入构建的 sql 字符串。这应该被参数化或移动到存储过程。
-
感谢您的快速回复。由于我是唯一将使用此代码的人,因此我不太担心任何进行任何类型 SQL 注入攻击的人。虽然我同意你的观点,但我觉得 SP 对我的目的来说有点矫枉过正。因此,虽然我很欣赏这种洞察力,但我希望其他人可以提供有关我的代码为何无法正常工作的更多信息。
-
我并没有说这会矫枉过正。即使我是唯一一个使用它的人,我也会参数化查询。调试恕我直言更容易。我不知道您的代码不起作用的确切原因,因为这里没有共享许多细节。似乎有点怀疑您传递的是组合框的文本而不是值。这很可能是问题所在。
-
对不起,我认为我用我的代码陈述的内容对初学者有好处。我目前正在研究对查询进行参数化,因此希望这能让我有所收获。另外,我尝试过传递值而不是文本,这没有区别。例如,组合列表中的第一家公司是“Six Hartford”,无论我将其作为值还是文本传递,我都会得到“运行时错误'-2147217900 (80040e14)':Hartford 附近的语法不正确”。它总是在从组合框传递的任何值的第二个单词附近抛出语法错误。
-
您需要做的是捕获 sql 变量中的值并确定您收到语法错误的原因。从消息中可以明显看出您的 sql 字符串无效。也许您正在传递一个带有单个刻度线的值?你没有逃避那些,所以也许这就是问题所在。我在黑暗中拍摄。
标签: sql-server vba combobox ado