【问题标题】:Load data from SQL into listbox in HTA (VBscript)将数据从 SQL 加载到 HTA (VBscript) 中的列表框中
【发布时间】:2021-01-14 21:12:47
【问题描述】:

我有一个从 SQL 查询接收数据的 HTA(html 应用程序),但是当我尝试将结果粘贴到列表框中时,它只给出最后一条记录。

Dim connect, sql, resultSet, pth, txt
Set connect = CreateObject("ADODB.Connection")
    connect.ConnectionString = "Driver={SQL Server};Server=XXX;Database=XXX;trusted_connection=True;" 
    connect.Open

sql = "SELECT [Var0],[Var1],[Var2],[Var3], [Var4], [Var5] FROM [XXX].[dbo].[Table]"
sql = sql & " WHERE [Var3]='" & FieldUser.value & "' and [Var0]='" & YEAR(Date()) & "-" & RIGHT("00"&MONTH(Date()),2) & "-" & RIGHT("00"&DAY(Date()),2) & "'"
sql = sql & " ORDER BY [Var0] desc ,[Var1] desc"

Set resultSet = connect.Execute(sql)

On Error Resume Next
resultSet.MoveFirst
Do until resultSet.eof 

objOption3.Text = ""

if resultSet(0) <> "" then 

    'msgbox(resultSet(0) & " ~ " & resultSet(1) & " ~ " & resultSet(2) & " ~ " & resultSet(3) & " ~ " & resultSet(4) & " ~ " & resultSet(5))
    objOption3.Text = resultSet(1) & " ~ " & resultSet(3)
    objOption3.Value = resultSet(0) & ";" & resultSet(1) & ";" & resultSet(2) 
    RegListView.Add (objOption3)
end if

  resultSet.MoveNext
Loop


resultSet.Close
connect.Close
Set connect = Nothing

当我取消注释 MsgBox 时,我可以看到所有记录都已找到,但它只输出最后一条记录(似乎迭代查询正确但仅在连接关闭时执行添加操作?)

如何让它输入列表框中的所有记录?

我尝试更改 Add 行但没有成功 - 我更改为:

document.all.RegListView.add(objOption3)

我还尝试将 resultSet 输出为数组 - 我可以让 msgbox 正确显示数组中的记录,但它没有添加到列表框中 - 也许有人可以帮助我以这种方式解决它?

连接内部:

dim dbarray
dbarray = resultSet.getrows

连接关闭后:

for i=1 to 100

    objOption3.Text = ""
    objOption3.Value = ""
    
if dbarray(0,i) <> "" then
    msgbox (dbarray(1,i) & " ~ " & dbarray(3,i))
    objOption3.Text = dbarray(1,i) & " ~ " & dbarray(3,i)
    objOption3.Value = dbarray(0,i) & ";" & dbarray(1,i) & ";" & dbarray(2,i) 
    RegListView.Add (objOption3)
end if
next

我真的希望得到一些帮助:)

添加: 这是 HTA 的 HTML 正文:

<body>

<table style="width:100%">
<h1>OpgaveTid for <span id="TextUser"></span><span style="padding-left:90px"><input type="button" value="Mindre" id="SendBtnMinimer" style="width: 50px;" onclick="vbscript:Minimeropgavetid()"/></h1>


<tr>
<td>
<label for="FieldSearchOrg">Search Org:</label><br>
<input type="text" id="FieldSearchOrg" name="FieldSearchOrg" onchange="vbscript:FuncSearchOrg()" tabindex="1" size=8>
<input type="button" value="Save" id="SendBtn" onclick="vbscript:SaveAction()" tabindex="3"/>
<input type="button" value="Part" id="SendBtn" onclick="vbscript:SavePartAction()" tabindex="4"/>
<input type="hidden" id="FieldOrgText" name="FieldOrgText" readonly="yes">
<input type="hidden" id="FieldUser" name="FieldUser" readonly="yes">
<input type="hidden" id="FieldUserGroup" name="FieldUserGroup" readonly="yes">
</td>
<td>

</td>
</tr>
<tr>
<td>
<label for="OrgListView">Orglist:</label><br>
<select size="28" name="OrgListView" style="width:160" multiple="no" onchange="vbscript:FuncSelectOrg()" tabindex="2"></select><br><br>
<label for="RegListView">My registrations:  (Tryk F5 for at opdatere)</label><br>
<select size="14" name="RegListView" style="width:160" multiple="no" onchange="vbscript:FuncSelectHistReg()"></select><br><br>
<input type="button" value="Edit registration" id="UpdateReg" style="width: 150px;" onclick="vbscript:UpdateReg()"/>
<input type="button" value="Delete registration" id="DeleteReg" style="width: 150px;" onclick="vbscript:DeleteReg()"/><br><br>
</td>
<td>

</td>
</tr>
</table>
</body>

【问题讨论】:

  • 删除 On Error Resume Next 以查看实际错误。您能否也请edit 提出问题,以便它显示RegListView 在HTML 中所指的内容?
  • 您可能想要查找“SQL 注入”。另请参阅xkcd.com/327
  • @Lankymart :删除 On Error Resume Next 没有显示任何错误。 @GeertBellekens:你能给我一个关于“SQL 注入”的提示吗? - 我找不到任何可以解决我问题的方法
  • @NickiRB 这很好,在调试问题时,您不想使用On Error Resume Next 隐藏任何错误。
  • @NickiRB 在 HTML 中有一些奇怪的语法 在事件处理程序中使用 vbscript: 名字是不必要的,它主要与超链接的 href 属性一起使用以触发事件处理程序从一个链接。正如 Geert 指出的那样,您需要仔细考虑 SQL 注入,这对于 HTA 来说并不是一个大问题,但如果您允许将数据从 HTA 上的字段直接传递到 SQL 查询中,您可能会被滥用。

标签: sql vbscript listbox adodb hta


【解决方案1】:

大多数时候,当您显示集合中的项目并且只显示最后一个项目时,可能是因为这些项目被覆盖并且在循环之后只显示最后一个项目。

在您的代码中,项目 (objOption) 在循环外定义,然后将文本和值分配给同一个对象并添加到循环内的选择中,最后显示最后一个选项。引发的错误正在被 on error resume next 抑制。

只需在循环内创建选项,然后分配属性并添加

Do until resultSet.eof 

    if resultSet(0) <> "" then 
        Set objOption = Document.createElement("option")
        objOption.Text = resultSet(1) & " ~ " & resultSet(3)
        objOption.Value = resultSet(0) & ";" & resultSet(1) & ";" & resultSet(2) 
        RegListView.Add (objOption)
    end if

    resultSet.MoveNext
Loop

【讨论】:

    【解决方案2】:

    我解决了问题...这确实不是最好的解决方案 - 但它解决了问题。

    欢迎提出任何改进建议。

        Set objOption4 = Document.createElement("OPTION")
    Dim connect, sql, resultSet, pth, txt
    
    dim dbarray
    
    Set connect = CreateObject("ADODB.Connection")
        connect.ConnectionString = "Driver={SQL Server};Server=XXX;Database=XXX;trusted_connection=True;" 
        connect.Open
    
    sql = "SELECT [Var0],[Var1],[Var2],[Var3], [Var4], [Var5] FROM [XXX].[dbo].[Table]"
    sql = sql & " WHERE [Var3]='" & FieldUser.value & "' and [Var0]='" & YEAR(Date()) & "-" & RIGHT("00"&MONTH(Date()),2) & "-" & RIGHT("00"&DAY(Date()),2) & "'"
    sql = sql & " ORDER BY [Var0] desc ,[Var1] desc"
    
    Set resultSet = connect.Execute(sql)
    
    dbarray = resultSet.getrows
    
    'On Error Resume Next
    resultSet.MoveFirst
    Do until resultSet.eof 
    
    objOption4.Text = ""
    
    if resultSet(0) <> "" then 
    
        'msgbox(resultSet(0) & " ~ " & resultSet(1) & " ~ " & resultSet(2) & " ~ " & resultSet(3) & " ~ " & resultSet(4) & " ~ " & resultSet(5))
        objOption4.Text = resultSet(1) & " ~ " & resultSet(3)
        objOption4.Value = resultSet(0) & ";" & resultSet(1) & ";" & resultSet(2) 
        'RegListView.Add(objOption4)
        'document.all.RegListView.add(objOption4)
    end if
    
      resultSet.MoveNext
    Loop
    
    
    resultSet.Close
    connect.Close
    Set connect = Nothing
    

    通过使用我在连接中创建的数组,我在数组和列表框上运行 2 个循环来添加记录

    for i=1 to 100
      objOption4.Text = ""
      objOption4.Value = ""   
    if dbarray(1,i) <> "" and dbarray(3,i) <> "LOGON" then
      'msgbox (dbarray(1,i) & " ~ " & dbarray(3,i))
      objOption4.Text = dbarray(1,i) & " ~ " & dbarray(3,i)
      objOption4.Value = dbarray(0,i) & ";" & dbarray(1,i) & ";" & dbarray(2,i) 
      objOption4.id = i
      if objOption4.Value <> "" then
    
          j=0
          k=0
          For Each o In Document.getElementById("RegListView").Options
              if k=0 then
                  if o.text = "" Then
                      j=j+1
                      'MsgBox o.Text
                      o.text = objOption4.Text
                      o.value = objOption4.Value
                      k=1
                  End if
              End if
          Next
    
          'msgbox (objOption4.Value)
          RegListView.Add(objOption4),0+i
      end if
    end if
    next
    

    【讨论】:

    • 您也可以指出您为实际解决问题所做的工作。
    • 感谢您的建议 - 我添加了一个部分来描述我为解决它所做的更改
    猜你喜欢
    • 1970-01-01
    • 2015-06-06
    • 2018-10-27
    • 2011-12-25
    • 2014-12-06
    • 1970-01-01
    • 2015-06-25
    • 2015-06-23
    • 2016-02-04
    相关资源
    最近更新 更多