重新排列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
答
获取列名,再成立一家排序为他们:
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和总和位于。
使用正确编写的代码,结果集中列的顺序根本无关紧要,您不应该使用位置索引,而应使用命名索引。 – 2010-04-22 16:57:34
SP返回任意数量的列,其名称同样是任意的。 – Sukotto 2010-04-22 16:59:14
所以排序是按列类型?数据列是任意的,总计列也是任意命名的? – Harv 2010-04-22 17:06:58