標題標題  顯示論壇會員列表名單  搜索論壇搜索  HelpHelp
  注冊注冊  登入登入
ASP教學區
 DoReMe : ASP教學區
主題 話題: 第二十三章 操作記錄集 回復發表新主題
作者
貼子內容 << Prev Topic下一個主題 >>
erisa
Groupie
Groupie


加入: 2005/2月/16
Online Status: Offline
回復: 43
Posted: 2005/2月/16 11:51上午 | IP記錄 引用 erisa

在第22章「Activex數據對像」中,你學習了如何使用ADO連接對像打開一個數據庫連接。你還學習了如何用一個打開的連接 執行SQL命令和返回記錄集。但是,操作記錄集對象的方法並沒有討論。

這一章講述如何使用記錄集對象。在第一節,你將學習用這種對像顯示數據的基本方法。在第二節,你將學習如何用各種不同類型的游標 和鎖定打開一個記錄集。最後,第三節講述了許多操作記錄集中記錄的高級方法。

Back to Top 查看 erisa's 資料 搜索其他貼子 erisa 訪問 erisa's
 
erisa
Groupie
Groupie


加入: 2005/2月/16
Online Status: Offline
回復: 43
Posted: 2005/2月/16 11:52上午 | IP記錄 引用 erisa

用記錄集顯示記錄

記錄集可以用來代表表中的記錄。與表一樣,一個記錄集包含一條或多條記錄(行),每個記錄包括一個或多個域(字段)。在任何時刻 ,只有一條記錄是當前記錄。

要創建記錄集對象的一個實例,你可以使用連接對象的Execute()方法。當你用Execute()方法從一個數據庫返回查詢 結果時,一個記錄集對像會被自動創建。這裡有一個例子:

 

<%

Set MyConn=Sever.CreateObject(「ADODB.Connection」)

MyConn.Open 「FILEDSN=d:\Program Files\

Common Files\ODBC\Data Sources\MyData.dsn」

Set RS=MyConn.Execute(「SELECT * FROM Mytable」)

RS.Close

MyConn.Close

%>

 

在這個例子中,使用一個SQL SELECT語句從一個表Mytable中返回了所有的記錄。Execute()方法返回一個記錄集。在這個腳本中,該記錄集被 分配給變量RS,然後關閉了這個記錄集。最後,關閉與數據庫的連接。

記錄集中的每一條記錄都對應於表Mytable中的一條記錄。要顯示記錄集中的所有記錄,你只要簡單地做一個循環就可以,如下例 所示:

 

<%

Set MyConn=Sever.CreateObject(「ADODB.Connection」)

MyConn.Open 「FILEDSN=d:\Program Files\

Common Files\ODBC\Data Sources\MyData.dsn」

Set RS=MyConn.Execute(「SELECT * FROM Mytable」)

WHILE NOT RS.EOF

Response.Write(「<BR>」&RS(「Mycolumn」))

RS.MoveNext

WEND

RS.Close

MyConn.Close

%>

 

在這個例子中,WHILE……WEND循環用來掃瞄記錄集RS中的每一條記錄,把每個記錄的Mycolumn域輸出到瀏覽器。這 段腳本顯示了表Mytable中的所有記錄。

當一個記錄集對像中收集了數據時,當前記錄總是第一條記錄。在上面的例子中,調用了記錄集對象的MoveNext方法,使當前記 錄移到下一條記錄。當所有的記錄都顯示完時,記錄集對象的EOF屬性的值將變為true,從而退出WHILE……WEND循環。

一個記錄集對像有一個域集合,包含一個或多個域對象。一個域對像代表表中的一個特定的字段。例如,在上面的腳本中,使用了表達式 RS(「Mycolumn」)來顯示字段Mycolumn。實際上,你可以通過許多中途徑顯示一個字段的值。下面的每一個表達式 都可以顯示字段Mycolumn的值:

 

RS(「Mycolumn」)

RS(0)

RS.Fields(「Mycolumn」)

RS.Fields(0)

RS.Fields.Item(「Mycolumn」)

RS.Fields.Item(0)

 

注意你既可以通過字段名,也可以通過順序號來指定一個字段。例如,你可以使用RS(「Mycolumn」)或RS(0)來代表字 段Mycolumn.兩種方法起到同樣的效果,因為字段Mycolumn對應於表中的第一個字段(第一個字段的順序號是0)。

當你不知道一個記錄集中的字段名時,通過順序號指定一個域是有用處的。例如,下面的ASP腳本顯示了一個表中的所有記錄的所有字 段(見圖23.1):

 

<HTML>

<HEAD><TITLE>Show All Rows And Columns</TITLE></HEAD>

<BODY>

<%

Set MyConn=Sever.CerateObject(「ADODB.Connection」)

MyConn.Open 「FILEDSN=d:\Program Files\

Common Files\ODBC\Data Source\MyData.dsn」

Set RS=MyConn.Execute(「SELECT * FROM Mytable」)

%>

<TABLE BORDER=1>

<TR>

<% FOR i=0 to RS.Fields.Count-1 %>

<TH><% =RS(i).Name *></TH>

<% Next %>

</TR>

<% While Not RS.EOF %>

<TR>

<% FOR i=0 TO RS.Fields.Count-1 %>

<TD><% = RS(i) %></TD>

<% Next %>

</TR>

<%

RS.MoveNext

WEND

RS.Close

MyConn.Close

%>

</TABLE>

</BODY>

</HTML>

 

 

 

圖23.1 顯示一個數據表中的所有的記錄

 

 

 

在這個例子中,域集合的Count屬性用來返回該記錄集中的域的數目。Name屬性用來返回每個域的名字。兩個FOR……NEX T循環用來對記錄集中的所有字段進行操作。不論表中有多少記錄和字段,它們將被全部顯示。

Back to Top 查看 erisa's 資料 搜索其他貼子 erisa 訪問 erisa's
 
erisa
Groupie
Groupie


加入: 2005/2月/16
Online Status: Offline
回復: 43
Posted: 2005/2月/16 11:53上午 | IP記錄 引用 erisa

記錄集游標和鎖定類型

你可以用四種類型的游標打開一個記錄集。游標決定了你可以對一個記錄集進行什麼操作。游標還決定了其他用戶可以對一個記錄集進行 什麼樣的改變。下面列出了游標的不同類型和限制:

 


adOpenFowardOnly。使用前向游標,你只能在記錄集中向前移動。


adOpenKeyset。使用Keyset游標,你可以在記錄集中向前或向後移動。如果另一個用戶刪除或改變了一條記錄,記錄 集中將反映這個變化。但是,如果另一個用戶添加了一條新記錄,新記錄不會出現在記錄集中。


adOpenDynamic。使用動態游標,你可以在記錄集中向前或向後移動。其他用戶造成的記錄的任何變化都將在記錄集中有所 反映。


adOpenStatic。使用靜態游標,你可以在記錄集中向前或向後移動。但是,靜態游標不會對其他用戶造成的記錄變化有所反 映。

 

在缺省情況下,當你打開一個記錄集時,將用前向游標打開它。這意味著你只能用MoveNext方法在記錄集中向前移動。對記錄集 的其它操作將不受支持。

前向游標的好處是它比較快。無論何時,如果前向游標可以實現你的要求,你就應該使用前向游標。但是,如果你需要用功能更強的游標 打開記錄集,你可以使用如下的腳本:

 

<!--#INCLUDE VIRTUAL=」ADOVBS.inc」-->

<%

Set MyConn=Sever.CreateObject(「ADODB.Connection」)

Set RS=Sever.CreateObject(「ADODB.RecordSet」)

MyConn.Open 「FILEDSN=d:\Program Files\

Common Files\ODBC\Data Sources\MyData.dsn

RS.Open 「SELECT * FROM Mytable」,MyConn,adOpenDynamic

RS.Close

MyConn.Close

%>

 

要用一種特定的游標打開記錄集,你必須顯式地創建這個記錄集。然後用該游標類型打開它。要做到這一點,你首先要創建記錄集對象的 一個實例。接下來,你要用Open方法,通過一個連接和一種游標類型,打開這個記錄集。在這段腳本中,用連接對像MyConn和 一個動態游標打開了記錄集RS。

打開記錄集時,你也可以指定鎖定類型。鎖定類型決定了當不止一個用戶同時試圖改變一個記錄時,數據庫應如何處理。你可以指定下面 的四種鎖定類型:

 


adLockReadOnly。指定你不能修改記錄集中的記錄。


adLockPessimistic。指定在編輯一個記錄時,立即鎖定它。


adLockOptimstic。指定只有調用記錄集的Update方法時,才鎖定記錄。


adLockBatchOptimstic。指定記錄只能成批地更新。

 

在缺省情況下,記錄集使用只讀鎖定。要指定不同的鎖定類型,你可以在打開記錄集時包含這些鎖定常量之一。這裡有一個例子:

 

<!--#INCLUDE VIRTUAL=」ADOVBS.inc」-->

<%

Set MyConn=Sever.CreateObject(「ADODB.Connection」)

Set RS=Sever.CreateObject(「ADODB.RecordSet」)

MyConn.Open 「FILEDSN=d:\Program Files\

Common Files\ODBC\Data Sources\MyData.dsn

RS.Open 「SELECT * FROM Mytable」,MyConn,adOpenDynamic,adLockPessimistic

RS.Close

MyConn.Close

%>

 

這個腳本與上一個基本相同,只是增加了鎖定類型。當打開記錄集RS時,將使用adLockPessimistic鎖定。這意味著 這個記錄集中的記錄可以被修改。(下一集中將討論如何修改)

最後,打開一個記錄集時,你可以指定一個Options參數。Options參數標明用來打開記錄集的命令字符串的類型。告訴A DO被執行的字符串內容的有關信息有助於高效地執行該命令字符串。

你可以使用下面的常量作為Options參數:

 


adCMDTable。被執行的字符串包含一個表的名字。


adCMDText。被執行的字符串包含一個命令文本。


adCMDStoredProc。被執行的字符串包含一個存儲過程名。


adCMDUnknown。不指定字符串的內容。(這是缺省值。)

 

在下面的腳本中,Options參數用來告訴ADO,命令字符串的內容是命令文本:

 

<!--#INCLUDE VIRTUAL=」ADOVBS.inc」-->

<%

Set MyConn=Sever.CreateObject(「ADODB.Connection」)

Set RS=Sever.CreateObject(「ADODB.RecordSet」)

MyConn.Open 「FILEDSN=d:\Program Files\

Common Files\ODBC\Data Sources\MyData.dsn

RS.Open 「SELECT * FROM Mytable」,MyConn,adOpenDynamic,adCMDText

RS.Close

MyConn.Close

%>

Back to Top 查看 erisa's 資料 搜索其他貼子 erisa 訪問 erisa's
 
erisa
Groupie
Groupie


加入: 2005/2月/16
Online Status: Offline
回復: 43
Posted: 2005/2月/16 11:53上午 | IP記錄 引用 erisa

操作記錄集的高級方法

到現在為止,你只學習了如何用SQL來修改記錄集中的記錄。但是,你還可以使用許多記錄集方法修改記錄集中的記錄。下面列出了每 種方法的簡要說明:

 


AddNew。向記錄集中添加一條新記錄。


CancelBatch。(當記錄集處在批量更新模式時)取消一批更新。


CancelUpdate。(調用Update之前)取消對當前記錄所做的所有修改。


Delete。從記錄集中刪除一條記錄。


Update。保存對當前記錄所做的修改。


UpdateBatch。(當記錄集處於批量更新模式時)保存對一個或多個記錄的修改。

 

例如,你可以用AddNew方法向一個打開的記錄集中添加一條空記錄:

 

<!--#INCLUDE VIRTUAL=」ADOVBS.inc」-->

<%

Set MyConn=Sever.CreateObject(「ADODB.Connection」)

Set RS=Sever.CreateObject(「ADODB.RecordSet」)

MyConn.Open 「FILEDSN=d:\Program Files\

Common Files\ODBC\Data Sources\MyData.dsn

RS.Open 「SELECT * FROM Mytable」,MyConn,adOpenDynamic,adCMDText

RS.AddNew

RS(「MyColumn」)=」A new column」

RS.Update

RS.Close

MyConn.Close

%>

 

在這個腳本中,用AddNew方法創建了一條新記錄。接著,新記錄的MyColumn域被賦值「A new column」。最後,調用Update方法保存新記錄。要使用這些方法,記錄集必須以只讀方式以外的其它鎖定方式打開。

你也可以使用SQL INSERT語句向一個表中添加新記錄,以取代AddNew方法。通常,使用SQL比使用上述的方法要好一些,因為SQL更加靈 活。本書的其餘部分將使用SQL來操作數據庫中的數據。

 

遍歷記錄集

記錄集對像有許多在記錄之間移動的方法。這些方法的大部分只有在記錄集以某種特定的游標打開時才可以使用。下面列出了記錄集對象 的一些方法及其功能的說明:

 


Move NumRecords。在記錄集中向前或向後移動指定數目的記錄數。


MoveFirst。移動到記錄集的第一條記錄。


MoveNext。移動到記錄集的下一條記錄。


MovePrevious。移動到記錄集中的上一條記錄。


MoveLast。移動到記錄集的最後一條記錄。

 

記錄集對像還有許多屬性,對遍歷記錄集是有用處的。同樣,許多屬性需要特定的游標類型:

 


AbsolutePosition。用來設置或讀取當前記錄在記錄集中的位置順序號。


BOF。標明當前位置在記錄集中的第一條記錄之前。


EOF。標明當前位置在記錄集中的最後一條記錄之後。


RecordCount。表示一個記錄集中的記錄總數。

 

例如,假設你想在一個記錄集中反向移動,你可以使用MoveLast和MovePrevious方法,以及BOF屬性。下面的A SP網頁演示了該如何實現:

 

<HTML>

<HEAD><TITLE> Backwards Recordset </TITLE></HEAD>

<BODY>

<!--#INCLUDE VIRTUAL=」ADOVBS.inc」-->

<%

Set MyConn=Sever.CreateObject(「ADODB.Connection」)

Set RS=Sever.CreateObject(「ADODB.RecordSet」)

MyConn.Open 「FILEDSN=d:\Program Files\

Common Files\ODBC\Data Sources\MyData.dsn

RS.Open 「SELECT * FROM Mytable」,MyConn,adOpenStatic

RS.MoveLast

WHILE NOT RS.EOF

Response.Write(「<BR>」&RS(「MyCOlumn」))

WEND

RS.Close

MyConn.Close

%>

</BODY>

</HTML>

 

在這個例子中,用靜態游標打開記錄集。記錄集打開後,通過使用MoveLast和MovePrevious方法,該記錄集中的所 有記錄都被顯示,直至到達記錄集的開頭。BOF屬性用來檢測何時到達記錄集的開頭。

你可以用這種方法在一個記錄集中反向移動,但是,很難想像你有什麼理由需要這樣做。使用SQL語言自身對查詢結果進行排序是有效 的。如果你可以,你應該用ORDER BY子句對記錄進行排序。(要瞭解ORDER BY子句的更多內容,請參閱第10章,「SQL基礎」)

 

返回記錄數目

你可以用記錄集對象的RecordCount屬性來確定一個記錄集中的記錄總數。但是,你應該慎重使用這個屬性,因為這個屬性在 許多情況下效率極低。

對一個用前向游標打開的記錄集,你不能使用RecordCount屬性。你必須打開一個效率較低的游標才可以使用這個屬性,如下 例所示:

 

<!--#INCLUDE VIRTUAL=」ADOVBS.inc」-->

<%

Set MyConn=Sever.CreateObject(「ADODB.Connection」)

Set RS=Sever.CreateObject(「ADODB.RecordSet」)

MyConn.Open 「FILEDSN=d:\Program Files\

Common Files\ODBC\Data Sources\MyData.dsn

RS.Open 「SELECT Mycolumn FROM Mytable」,MyConn,adOpenStatic

Response.Write(RS.RecrdCount)

RS.Close

MyConn.Close

%>

 

這個腳本輸出表Mytable中的記錄數目,RecordCount屬性用來返回這個數字。為了能使用RecordCount屬 性,記錄集用一個靜態游標打開。

通常,你需要一個記錄數目的唯一原因是想確定是否至少有一條記錄滿足特定的條件。例如,你也許想檢查一下,是否一個人輸入了合法 的口令。在這種情況下,你可以查詢一個保存口令的表,用RecordCount屬性確定是否有口令存在。如果RecordCou nt大於0,說明有口令存在,否則說明沒有,該口令是 非法的。

但是,用EOF屬性檢測一個查詢是否返回了結果將會更好。當用前向游標打開了一個記錄集時,你可以使用EOF屬性。這裡有一個例 子:

 

<!--#INCLUDE VIRTUAL=」ADOVBS.inc」-->

<%

Set MyConn=Sever.CreateObject(「ADODB.Connection」)

Set RS=Sever.CreateObject(「ADODB.RecordSet」)

MyConn.Open 「FILEDSN=d:\Program Files\

Common Files\ODBC\Data Sources\MyData.dsn

RS.Open 「SELECT * FROM Password_Table

WHERE Password=」&Request.Form(「Password」),Myconn

IF RS.EOF THEN

Response.Write(「The password you entered is invalid.」)

ELSE

Response.Write(「Welcome to our web site!」)

END IF

RS.Close

MyConn.Close

%>

 

在這個例子中,用EOF屬性檢測是否一個查詢有返回結果。如果EOF屬性是true,說明用戶輸入的口令不在保存口令的表中。

在某些情況下,你的確需要返回記錄數目。例如,你也許想顯示在你站點上註冊的用戶總數。但是同樣,你應該避免使用RecordC ount屬性。取而代之,你可以執行一個SQL COUNT(*)查詢,如下例所示:

 

<!--#INCLUDE VIRTUAL=」ADOVBS.inc」-->

<%

Set MyConn=Sever.CreateObject(「ADODB.Connection」)

Set RS=Sever.CreateObject(「ADODB.RecordSet」)

MyConn.Open 「FILEDSN=d:\Program Files\

Common Files\ODBC\Data Sources\MyData.dsn

RS.Open 「SELECT COUNT(*) Mycount FORM Password_Table」,MyConn

%>

There are <% =RS(「MyCount」)%> registered users at the web site.

<%

RS.Close

MyConn.Close

%>

 

注意這個查詢中如何使用字段別名Mycount。通過給集合函數COUNT(*)提供一個名字,你可以在輸入查詢結果時使用這個 名字。

 

注意

下一章將討論用SQL存儲過程返回記錄數目的方法。參見「在命令對像中使用返回狀態值」一節。

 

對記錄集進行分頁

假設你想顯示你站點上銷售的一系列商品。但是,你正在經營幾百種項目。在這種情況下,你可能不希望把所有的商品顯示在同一個AS P頁中。這時允許用戶進行翻頁將是個不錯的辦法。

記錄集對像有三個屬性用於此目的。你可以使用這些屬性把一個記錄集中的記錄分成許多邏輯頁。通過把記錄集中的記錄進行分頁,你可 以一次只顯示記錄集中的一部分。下面列出了這些屬性:

 


AbsolutePage。指定當前的頁。


PagePount。返回記錄集中的邏輯頁數。


PageSize。指定一個邏輯頁中的記錄個數,缺省值是10。

 

要把一個記錄集分成多個頁,你應使用PageSize屬性指定一頁中的記錄個數。然後你就可以用AbsolutePage屬性移 動到一個特定的頁。最後,PageCount屬性可以用來反回總頁數。表23.1演示了如何使用這些屬性(見圖23.2)。

 

表23.1 pages.asp

<HTML><HEAD><TITLE> Recordset With Pages </TITLE></HEAD><BODY><!-- #INCLUDE VIRTUAL="ADOVBS.inc" --><%' Figure out the current pageIF Request.QueryString("MOVE")="NEXT" THEN Session("CurrentPage")=Session("CurrentPage")+1END IFIF Request.QueryString("MOVE")="PREV" THEN Session("CurrentPage")=Session("CurrentPage")-1END IFIF Session("CurrentPage")="" THEN Session("CurrentPage")=1END IF%><H1>Current Page: <%=Session("CurrentPage")%></H1><HR><%' Open a Connection and RecordsetSet MyConn=Server.CreateObject("ADODB.Connection")Set RS=Server.CreateObject("ADODB.RecordSet")MyConn.Open "FILEDSN=d:\Program Files\Common Files\ODBC\Data Sources\MyData.dsn"' Retrieve the list of productsRS.Open "SELECT ProductName FROM Products", MyConn,adOpenStatic' Set the number of records in a pageRS.PageSize=5' Set the current pageRS.AbsolutePage=Session("CurrentPage")' Show the records for the current pageWHILE NOT RS.EOF AND NumRows<RS.PageSize%><BR>Product Name: <%=RS("ProductName")%><%RS.MoveNextNumRows=NumRows+ 1WEND%><HR><% IF Session("CurrentPage")>1 THEN %><A HREF="pages.asp?MOVE=PREV"> [PREV] </A><% END IF %><% IF Session("CurrentPage")<RS.PageCount THEN %><A HREF="pages.asp?MOVE=NEXT"> [NEXT] </A><% END IF %><%RS.CloseMyConn.Close%></BODY></HTML> ;

 圖23.2 對記錄集進行分頁

這個ASP網頁一次顯示表Products中的五條記錄一個session變量Currentpage被用來跟蹤記錄集的當前頁 。當用戶單擊NEXT時,就顯示下一頁記錄,當用戶單擊PREV時,就顯示上一頁。

 

把記錄取到數組中

在特定情況下,你將需要把記錄集中的記錄取到數組中。例如,如果你需要修改一個記錄集中的數據,擔你不想改變記錄集中的記錄本身 ,這時你可以把記錄取到數組中。

要把一個記錄集中的記錄分配給一個數組,應使用記錄集對象的GetRows()方法。這裡有一個例子:

 

<%

Set MyConn=Sever.CreateObject(「ADODB.Connection」)

Set RS=Sever.CreateObject(「ADODB.RecordSet」)

MyConn.Open 「FILEDSN=d:\Program Files\

Common Files\ODBC\Data Sources\MyData.dsn

RS.Open 「SELECT MyFirstCol,MySecondCol FORM Mytable」,MyConn

MyArray=RS.GetRows()

RS.Close

MyConn.Close

%>

 

在這個腳本中,記錄集RS中包含的所有記錄被分配給數組MyArray。這個數組由GetRows()方法自動創建並添入數據。 GetRows()方法創建了一個二維數組,第一個下標代表字段數,第二個下標代表記錄數。

下面的腳本可以用來顯示數組MyArray中的內容:

 

<%

FOR i=0 TO UBOUND(MyArray,2)

%>

<BR> First Column:<%=MyArray(0,i)%>

<BR> Second column:<%=MyArray(1,i)%>

<%

NEXT

%>

 

VBScript函數UBOUND()用來確定數組的第二維的維數。FOR……NEXT循環用來掃瞄數組的所有元素。這個數組代 表一個有兩個字段的記錄集。當該數組的第一個下標值是0時,代表第一個字段,當第一個下標值是1時,代表第二個字段。

 

指定記錄集的最大容量

假設你想顯示在你站點上發佈的最後10條信息,但是不能超過10條信息。或者你想顯示3個連接,但是不超過3個。如何能夠限制取 到一個記錄集中的記錄數?記錄集對像有一個屬性用於此目的。通過使用MaxRecords屬性,你可以限制從一個數據庫查詢返回 到一個記錄集中的記錄數目。如下例所示:

 

<%

Set MyConn=Sever.CreateObject(「ADODB.Connection」)

Set RS=Sever.CreateObject(「ADODB.RecordSet」)

MyConn.Open 「FILEDSN=d:\Program Files\

Common Files\ODBC\Data Sources\MyData.dsn

RS.MaxRecords=10

RS.Open 「SELECT MyColumn FROM Mytable」,MyConn

WHILE NOT RS.EOF

Response.Write(「<BR>」&RS(「MyColumn」))

RS.MoveNext

WEND

RS.Close

MyConn.Close

%>

 

在這個腳本中,MaxRecords屬性被設為10。當記錄集RS被打開時,不會有超過10個記錄被取到RS中。即使表中有10 ,000條記錄,也只有10條記錄被取出。使用MaxRecords屬性時,你必須在打開記錄集之前設置該屬性值。記錄集打開之 後,該屬性將成為只讀的。

 

總結

這一章討論了記錄集對象。你學會了如何在ASP網頁中使用記錄集對像顯示表中的數據。你還學會了如何用不同類型的游標和鎖定打開 記錄集。最後,你學習了記錄集對象的一些高級方法。

Back to Top 查看 erisa's 資料 搜索其他貼子 erisa 訪問 erisa's
 

如果你想回復的話你必須首先 login
如果你還沒有注冊的話你必須首先 注冊

  回復發表新主題
顯示可打印的頁面 顯示可打印的頁面

論壇跳轉
不能 張貼新論題在這個討論版
不能 回應論題在這個討論版
不能 刪除你的發言在這個討論版
不能 編輯你的發言在這個討論版
不能 新增投票標題在這個討論版
不能 在這個討論版投票

Edit by doreme Forums version 2004
Welcome ©2001-2004 doreme Guide

This page was generated in 0.6875 seconds.

 
保養品
保養品, Skin Care
www.elady.tw
Makeups Wholesale
Wholesale Cosmetics SkinCares
lungjyi.com
保養品批發
名牌保養品、保養品批發
www.perfume.com.tw/skincare
Wholesale Perfumes
Fragrances Perfumes Wholesale
lungjyi.net