access數(shù)據(jù)庫隨機不重復讀取記錄
發(fā)布時間:2016/4/12 16:32:05 關注:1561
關于使用ASP隨機查詢數(shù)據(jù)庫中的數(shù)據(jù),有兩種兩見的數(shù)據(jù)庫,即Sql Server和 Access。
SQL server數(shù)據(jù)庫有個NewID函數(shù),可以很方便的用SQL語句得到數(shù)據(jù)表中的隨機數(shù)據(jù)。即可以使用以下SQL語句來實現(xiàn):
sql="Select top 10 * from TableName order by NewId()"
Access數(shù)據(jù)庫同樣提供一個Rnd函數(shù),可以通過以下SQL語句來實現(xiàn)隨機:
sql="select top 10 * from TableName order by Rnd(id)"
Rnd(id) 其中的id只是為了提供一個種子,可以利用其他任何數(shù)值來完成。在這里Id為主鍵的值,因為通常而言,主鍵一般為自動編號字段,即數(shù)值型。
可通過使用后發(fā)現(xiàn),程序在第一次執(zhí)行時是可以實現(xiàn)隨機取得記錄,但反復刷新后發(fā)現(xiàn),每次返回的數(shù)據(jù)都相同。分析后發(fā)現(xiàn),由于Access數(shù)據(jù)庫記錄集緩存的原因,從代碼里得到Access數(shù)據(jù)庫隨機記錄是得不到,需要用隨機SQL語句的辦法來消除緩存。
有人說在程序中加上Randomize初始化隨機種子,這只說對了一半,在程序中簡單的加上Randomize,是沒作用的,道理很簡單,Randomize不可能影響SQL語句中的Rnd,這個Rnd只不過是個字符串,SQL語句是通過數(shù)據(jù)庫引擎去執(zhí)行的,正因為如此,無法初始化種子,致使每次應用產生的隨機序列是一樣的。
由此可見,解決問題的關鍵就是如何初始化隨機種子。Rnd函數(shù)語法是Rnd(number),它有一個特性,就是如果使用了負參數(shù)的 number,那么就會產生一個固定的隨機序列。利用這個特性,我們的問題就迎刃而解了,這就是每次調用Rnd函數(shù)時,使用一個負的不同的number,從而達到產生不同隨機序列的目的。經過測試,問題解決。使用如下代碼即可使用正確的隨機。
Randomize
sql="select top 10 * from TableName order by Rnd("&Rnd()&"-id)"