2010-04-22 69 views
1

我有一個用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

回答

1

獲取列名,再成立一家排序爲他們:

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 
0

爲什麼你需要重新排序?如果你知道輸出遵循一定的模式:

日期,數據1,數據N,SUM1,SUM2

你必須Fields.Count讓你決定多少數據N列顯示,在該指數SUM1和總和位於。