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