1

レコードの配列を出力する関数を書くのに問題があります。私がやろうとしているのは、テーブル内のすべてのレコードを取得する関数を呼び出して、関数を呼び出すページで使用できる多次元配列を作成することです。

私が間違っていることを教えてもらえますか?

 function get_admins 
    set rs = Server.CreateObject("ADODB.recordset")
    rs.cursorType = 3
    getsql = "select * from users order by name asc"
    rs.Open getsql, conn
    total = rs.RecordCount
    ra = array
    c = 0
    if total < 1 then 
        o = "There are no admins yet."
    else
        do until rs.EOF
        id = rs.Fields("id").value
        username = rs.Fields("username").value
        adminname = rs.Fields("name").value
        email = rs.Fields("email").value

        Redim Preserve ra(c,4) '<-- This is the line the error doesn't like
    ra(c,0) = id
    ra(c,1) = username
    ra(c,2) = adminname
    ra(c,3) = email
    c = c + 1

        rs.MoveNext
        loop

       end if
      rs.close
      get_admins = ra
    end function

これは私が得るエラーです:

Microsoft VBScript ランタイム エラー '800a0009'

下付き文字が範囲外

ページ上の関数呼び出しは次のようになります。

<pre><%
        dim seeme 
    set seeme = get_admins
%></pre>

ここに私が見つけたいくつかの同様の質問があります:

従来の ASP 3.0 レコードセットから配列を作成する- 大いに役立ちましたが、十分ではありませんでした。

Redim Preserve が「添え字が範囲外」になる- これは私を混乱させただけです。

4

2 に答える 2

3

ReDim Preserve多次元配列の最後の次元のサイズしか変更できないため、状況ではあまり役に立ちません。ただし、使用できるのは配列の配列です。

ReDim ra(-1)  'initialize record array as empty array
...
Else
  Do Until rs.EOF
    ReDim va(3)  'initialize value array (clear values)
    va(0) = rs.Fields("id").value
    va(1) = rs.Fields("username").value
    va(2) = rs.Fields("name").value
    va(3) = rs.Fields("email").value

    Redim Preserve ra(UBound(ra)+1) 'grow record array
    ra(UBound(ra)) = va             'put value array into record array

    rs.MoveNext
  Loop
End If

これにより、ネストされた配列の要素に次のようにアクセスできます。

WScript.Echo ra(3)(1)

上記は、4番目のネストされた配列 (インデックス 3)から 2番目の値 (インデックス 1) を出力します。

Set配列を返すことに関しては、代入でキーワードを使用できません。

set seeme = get_admins   '<-- will fail!

これは、そのキーワードがオブジェクト割り当て用に予約されており、配列がオブジェクトではないためです。その行を次のように変更します。

seeme = get_admins
于 2013-07-25T20:12:55.150 に答える
1

自分で作成する代わりに、.GetRowsメソッドを見てください。

私の主張の背後にいくつかのコードを入れるには:

  Dim oTCN  : Set oTCN = CreateObject( "ADODB.Connection" )
  Dim sTDir : sTDir    = "M:\lib\kurs0705\testdata\txt"  ' <-- ohne \ am Ende!
  Dim sCS   : sCS      = Join( Array( _
                                "Provider=MSDASQL" _
                              , "Driver={Microsoft Text Driver (*.txt; *.csv)}" _
                              , "DBQ=" & sTDir _
                         ), ";" )
  oTCN.Open sCS
  Dim oRS
  Set oRS = oTCN.Execute("SELECT TOP 3 * FROM [gendata.txt]")
  Dim nUB : nUB = oRS.Fields.Count - 1
  ReDim aRow(nUB) ' array for one row
  ReDim aRows(nUB, -1) ' 2nd dim growable array for all rows
  Dim f
  For f = 0 To UBound(aRow)
      aRow(f) = oRS.Fields(f).Name
  Next
  WScript.Echo Join(aRow, ",")
  Do Until oRS.EOF
     ReDim Preserve aRows(nUB, UBound(aRows, 2) + 1)
     For f = 0 To UBound(aRow)
         aRow(f) = oRS.Fields(f).Value
         aRows(f, UBound(aRows, 2)) = oRS.Fields(f).Value
     Next
     WScript.Echo Join(aRow, ",")
     oRS.MoveNext
  Loop
  oRS.MoveFirst
  Dim aMagic : aMagic = oRS.GetRows() ' this is all you need!
  Dim r, c
  For r = 0 To UBound(aMagic, 2)
      For c = 0 To UBound(aMagic, 1)
          WScript.Echo r, c, aMagic(c, r), aRows(c, r)
      Next
      WScript.Echo
  Next

  oTCN.Close

出力:

=============================================================
iID,sFrsName,sLstName,sSex,dtBirth
1,Yqiqpbcmunrzvi,Pmyqcxfoffrfnwbd,U,8/7/2008
2,Viyvfshpxu,Xjtfbjuiiwojhyjwkefcu,U,7/27/2008
3,Hoocyseiiiawrt,Mrpuhzuhysslzhwhnpp,F,8/7/2008
0 0 1 1
0 1 Yqiqpbcmunrzvi Yqiqpbcmunrzvi
0 2 Pmyqcxfoffrfnwbd Pmyqcxfoffrfnwbd
0 3 U U
0 4 07.08.2008 07.08.2008

1 0 2 2
1 1 Viyvfshpxu Viyvfshpxu
1 2 Xjtfbjuiiwojhyjwkefcu Xjtfbjuiiwojhyjwkefcu
1 3 U U
1 4 27.07.2008 27.07.2008

2 0 3 3
2 1 Hoocyseiiiawrt Hoocyseiiiawrt
2 2 Mrpuhzuhysslzhwhnpp Mrpuhzuhysslzhwhnpp
2 3 F F
2 4 07.08.2008 07.08.2008

=============================================================

したがって、Ansgar の「多次元配列で ReDim Preserve を使用することはできません」とは反対に、多次元配列の最後の次元を拡張できます。つまり、より「自然な」行/列構造ではなく、行を増やして配列を列/行にレイアウトする必要があります。

aRows は、独自の .GetRows を正しくロールする方法を示しています。もちろん、次のようにを使用するのが賢明な戦略です。

Dim aMagic : aMagic = oRS.GetRows() ' this is all you need!
于 2013-07-25T20:38:02.667 に答える