當前位置:編程學習大全網 - 編程語言 - 我用VC在ACCESS裏隨即抽取10條記錄 select top 10*from table order by rnd(ID); 但是每次都是壹樣的10條

我用VC在ACCESS裏隨即抽取10條記錄 select top 10*from table order by rnd(ID); 但是每次都是壹樣的10條

Access數據庫可以通過“select top 10 * from tb order by rnd(id)”得到隨機數據,VBA環境下使用沒有問題,可惜在VB中使用,產生的隨機序列是壹樣的,每次調用返回的數據相同。

有人說在程序中加上Randomize初始化隨機種子,那麽這只說對了壹半,在程序中簡單的加上Randomize,是沒作用的,道理很簡單,Randomize不可能影響SQL語句中的Rnd,這個Rnd只不過是個字符串,SQL語句是通過數據庫引擎去執行的,正因為如此,無法初始化種子,致使每次應用產生的隨機序列是壹樣的。

由此可見,解決問題的關鍵就是如何初始化隨機種子。Rnd函數語法是Rnd(number),它有壹個特性,就是如果使用了負參數的number,那麽就會產生壹個固定的隨機序列。利用這個特性,我們的問題就迎刃而解了,這就是每次調用Rnd函數時,使用壹個負的不同的number,從而達到產生不同隨機序列的目的。經過測試,問題解決。示例代碼如下:

’......

Dim sql As String

Dim r As Single

Randomize

r = Rnd

sql = "select top 1 * from tb order by rnd(" & r & "-id)"

’......

代碼說明:SQL語句中的Rnd的參數是壹個數值表達式,必須包含表中的壹個字段(最好是主鍵),因為變量r返回的是壹個隨機的0到1之間的single,(壹般情況下表中的ID值都是大於1的),從而使參數的值是個小於0的隨機數,由此產生了不同的隨機序列。

補充壹點,有壹種提議用time來解決這個問題,就是"select top 10 * from tb order by rnd(" & time & "- id) "。在某些情況下是可以的,但是,如果妳需要快速連續的查詢信息,比如壹些搖號程序需要連續滾動地顯示信息,這種情況下,就會出現連續幾次返回重復的信息。究其原因,就是time在做數值運算的時候,會轉換為壹個小於1的Double,而rnd返回的是壹個Single,顯然,rnd返回的結果有可能會截去time-id運算後的尾數,在time變化很小的情況下,使rnd返回的值與前次相同,從而返回的查詢結果相同。

  • 上一篇:挖掘機國際基本操作有那些?
  • 下一篇:基於Spring+SpringMVC+Mybatis分布式敏捷開發系統架構(附源碼)
  • copyright 2024編程學習大全網