【问题标题】:VBScript - Return a Recordset in an Array (SQL Like function)VBScript - 返回一个数组中的记录集(SQL Like 函数)
【发布时间】:2016-06-03 12:43:35
【问题描述】:

我必须为我公司的会计编写一个程序,我在返回数组中的文章系列时遇到问题,我希望所有的系列都有一个以“707”开头的会计代码。这是我在 VBScript 中的代码:

Set objConnection = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
objConnection.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\BASES\Base.mdb;Persist Security Info=False"
rs.CursorLocation = adUseClient

FamilleQuery = "Select Code from FamilleArticle Where CptVenteFrance Like '707%'"
rs.Open FamilleQuery, objConnection, adOpenStatic, adLockOptimistic

'rs.MoveFirst
'Do
    'ListeFamille(rs.AbsolutePosition) = rs("Code")
    'rs.MoveNext
'Loop until rs.EOF

'ListeFamilleString = rs.GetString(AdClipString, -1,"/","/"," ")
'ListeFamille = split(ListeFamilleString,"/")

'Set ListeFamille = rs.GetRows

'for i=0 to ubound(rs)
    'ListeFamille(i) = rs.Fields("Code").Value(i)
'next

rs.Close
objConnection.Close

作为 cmets,您有我所有的尝试来返回数组中记录集的结果,但没有人不工作。 有人可以说我错在哪里吗?

【问题讨论】:

    标签: arrays vbscript ado sql-like recordset


    【解决方案1】:

    试试这个

    Option Explicit
    
    'ADO Constants
    Const adCmdText = 1
    Const adParamInput = 1
    Const adVarWChar = 202
    
    'Would usually be passed in from somewhere
    Dim value: value = "707%"
    
    Dim cmd, rs, data
    Dim conn: conn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\BASES\Base.mdb;Persist Security Info=False"
    Dim sql: sql = "Select Code from FamilleArticle Where CptVenteFrance Like ?"
    
    Set cmd = Server.CreateObject("ADODB.Command")
    With cmd
      .ActiveConnection = conn
      .CommandType = adCmdText
      .CommandText = sql
      Call .Parameters.Append(.CreateParameter("@value", adVarWChar, adParamInput, 50))      
    
      Set rs = .Execute(, Array(value))
      If Not rs.EOF Then data = rs.GetRows()
      Call rs.Close()
      Set rs = Nothing
    End With
    Set cmd = Nothing
    
    Dim row, rows
    
    If IsArray(data) Then
      'Test data (2d Array, 0 = column, 1 = row)
      Call WScript.Echo(data(0, 0))
    
      'Retrieving all rows
      rows = UBound(data, 2)
      For row = 0 To rows
        'First column from each row.
        Call WScript.Echo(data(0, row))
      Next
    Else
      'No records returned
    End If
    

    有用的链接

    【讨论】:

      【解决方案2】:

      您不需要 vbScript 中的 Set 将数组设置为记录集的行。您只在设置对象引用时使用Set,此处并非如此。

      ListeFamille = rs.GetRows 会将ListeFamille 设置为一个二维数组,其中包含记录集的结果。

      这是我自己的一个函数库的摘录:

      oConnection.open sConnectionString
      oRecordSet.open sSql, oConnection
      If oRecordSet.RecordCount = 0 Then
          DataArray = ""
      Else
          oRecordSet.MoveFirst
          DataArray = oRecordSet.GetRows
      End If
      

      【讨论】:

      • 我尝试了使用和不使用Set,但没有成功,我尝试将数组读取为 1 维和 2 维数组,但没有一个对我不起作用。
      • 只有在返回的记录集不为空的情况下才会起作用——您是否检查过查询是否返回了数据?
      • 是的,记录集毫无问题地返回了我的家庭。 MsgBox rs(0) 返回我表的第一个家庭,但 MsgBox ListeFamille(0,0) 不返回任何内容(MsgBox ListeFamille(0) 也不返回)。
      • 我已经从我自己的一个有效的 vbs 函数库中添加了一个提取 - 你应该得到 ListeFamille(0,0) 中的第一个家庭(以及所有其他家庭,通过增加数组的第二维 - 第一个用于各个列,您的查询中只有一个列)
      • 为没有结果的查询返回一个空字符串对我来说似乎是错误的。我建议返回一个空数组 (DataArray = Array),或者至少返回一个 Null
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-19
      • 2012-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多