重新排列ADO记录集中的列(字段)

问题描述:

我有一个用vbscript编写的经典asp网页,输出第三方存储过程的结果。我的用户希望页面以不同于从数据库进来的顺序显示数据列。 是否有一种简单且安全的方式来重新排列ADO记录集中的列?重新排列ADO记录集中的列(字段)

我没写这个页面,也无法更改SP。 我可以在这里完成的最小变化是什么,而不是冒险搞砸页面中的所有其他内容?

的代码看起来像

dim Conn, strSQL, RS 
Set Conn = Server.CreateObject("ADODB.Connection") 
Conn.Open ServerName 

Set strSQL = "EXEC storedProc @foo = " & Request("fooParam") 
'This stored procedure returns a date column, an arbitrary ' 
' number of data columns, and two summation columns. We ' 
' want the two summation columns to move so they appear ' 
' immediately after the data column ' 

Set RS = Server.CreateObject("ADODB.RecordSet") 
RS.ActiveConnection = Nothing 
RS.CursorLocation = adUseClient 
RS.CursorType = adOpenStatic 
RS.LockType = adLockBatchOptimistic 
RS.Open strSQL, Conn, adOpenDynamic, adLockOptimistic 

dim A 

' ----- ' 
' Insert some code here to move the columns of the RS around ' 
' to suit the whim of my user ' 
' ----- ' 


' Several blocks of code that iterate over the RS and display it various ways ' 
RS.MoveFirst 
For A = 0 To RS.Fields.Count -1 
    ' do stuff ' 
Next 

... 

RS.MoveFirst 
For A = 0 To RS.Fields.Count -1 
    ' do more stuff ' 
Next 

RS.Close : Set RS = Nothing 
Conn.Close : Set Conn = Nothing 
+0

使用正确编写的代码,结果集中列的顺序根本无关紧要,您不应该使用位置索引,而应使用命名索引。 – 2010-04-22 16:57:34

+0

SP返回任意数量的列,其名称同样是任意的。 – Sukotto 2010-04-22 16:59:14

+0

所以排序是按列类型?数据列是任意的,总计列也是任意命名的? – Harv 2010-04-22 17:06:58

获取列名,再成立一家排序为他们:

dim ColumnNames 
set ColumnNames = CreateObject("Scripting.Dictionary") 
For A = 0 To RS.Fields.Count -1 
    ColumnNames.Add A, RS.Fields(A).Name 
Next 

这里,COLUMNNAMES持有列的名称,用于每个位置。应用无论规则是有意义的,你现在可以更改排序像这样:

'' swap order of columns 1 and 2 
dim temp 
temp = ColumnNames.item(1) 
ColumnNames.item(1) = ColumnNames.item(2) 
ColumnNames.item(2) = temp 

最后,以获得新的订单,打印如下:

For A = 0 To RS.Fields.Count -1 
    Response.write(ColumnNames.item(A)) 
Next 

为什么你需要重新排序?如果你知道输出遵循一定的模式:

日期,数据1,数据N,SUM1,SUM2

你必须Fields.Count让你决定多少数据N列显示,在该指数SUM1和总和位于。