2009-03-26 8 views
1

Accessデータベースからランダムに異なる行を返すクエリがあります。なぜAccessDataSourceはAccessでクエリに異なる結果を返しますか?

SELECT * FROM 
(SELECT DISTINCT m.MemberID, m.Title, m.FullName, m.Address, 
     m.Phone, m.EmailAddress, m.WebsiteAddress FROM Members AS m INNER JOIN MembersForType AS t ON m.MemberID = t.MemberID WHERE 
(Category = 'MemberType1' OR Category = 'MemberType2')) as Members 
ORDER BY RND(members.MemberID) DESC 

これをAccessで実行すると、ランダムなソート順に従って、毎回異なる順序で行が返されます。しかし、私はそれを私のWebアプリケーションを介して実行すると、行は毎回同じ順序で戻ります。ここで私は私のコードビハインドでそれを呼び出す方法です:私は多分、クエリがキャッシュされていたが、結果は同じだと思ったので、

private void BindData() 
{ 
    using (AccessDataSource ds = new AccessDataSource("~/App_Data/mydb.mdb", GetSQLStatement())) 
    { 
     ds.DataSourceMode = SqlDataSourceMode.DataReader; 
     ds.CacheDuration = 0; 
     ds.CacheExpirationPolicy = DataSourceCacheExpiry.Absolute; 
     ds.EnableCaching = false;    
     listing.DataSource = ds.Select(new DataSourceSelectArguments()); 
     listing.DataBind(); 
     if (listing.Items.Count == 0) 
      noResults.Visible = true; 
     else 
      noResults.Visible = false; 
    } 
} 

私は、キャッシュに関するすべてのものに追加しました。私はコードにブレークポイントを入れて、クエリが上記と同じであったことを確認しました。

アイデア?これは私をナットにしている。

+0

同じランダムな順番で返されますか、または表示されている順序に何らかの情報がありますか? –

+0

同じランダムな順序で表示されます。 – Phill

+0

私はこれをコメントに入れておきます。私はトラブルシューティングのアイデアで回答ではありませんが、Web版のselect節に "RND(members.MemberID)"を追加してみましたが、同じランダムを返すかどうか確認しています毎回ナンバー? 1つの考えは、結果をキャッシュすることでRND()を最適化することです。 – JohnFx

答えて

2

にRNDを移動します。 MS Accessを使用する場合、毎回同じ接続を使用しているため、毎回異なる値を取得する理由が説明されています。

は、これらのVBAの例を考えてみましょう:

Sub TestDiff() 

    Dim con As Object 
    Set con = CreateObject("ADODB.Connection") 
    With con 
    .ConnectionString = _ 
     "Provider=MSDataShape;Data " & _ 
     "Provider=Microsoft.ACE.OLEDB.12.0;" & _ 
     "Data Source=C:\Tempo\Test_Access2007.accdb" 
    .CursorLocation = 3 

    Dim i As Long 
    For i = 0 To 2 

     .Open 
     Debug.Print .Execute("SELECT RND FROM OneRowTable;")(0) 
     .Close 
    Next 
    End With 

End Sub 

出力:

0.705547511577606 
0.705547511577606 
0.705547511577606 

注同じ値毎回最初は、各反復で新しい接続を使用しています。

第二の例は、(.Openと.Close文がループの外側に再配置されている)各反復で同じ接続を使用する:

Sub TestSame() 

    Dim con As Object 
    Set con = CreateObject("ADODB.Connection") 
    With con 
    .ConnectionString = _ 
     "Provider=MSDataShape;Data " & _ 
     "Provider=Microsoft.ACE.OLEDB.12.0;" & _ 
     "Data Source=C:\Tempo\Test_Access2007.accdb" 
    .CursorLocation = 3 

    .Open 

    Dim i As Long 
    For i = 0 To 2 
     Debug.Print .Execute("SELECT RND FROM OneRowTable;")(0) 
    Next 

    .Close 

    End With 

End Sub 

出力:

0.705547511577606 
0.533424019813538 
0.579518616199493 

注異なる値毎回。

VBAコードでは、Rnd()関数をシードするためにRandomizeキーワードを使用できますが、これはACE/Jetでは実行できないと思います。 1つの回避策は、ACE/Jet NOW()の最小数部分を使用することです。何かのように:

SELECT CDBL(NOW()) - ROUND(CDBL(NOW()), 4) FROM OneRowTable 
+0

ここに何かがあるかもしれません... OleDbConnectionを使用するようにコードを変更したので、毎回新しいものを作成して、期待どおりに動作します。 – Phill

+0

新しいコード:使用(OleDbConnectionオブジェクトCONN =新しいOleDbConnectionオブジェクト(STR) {conn.Open(); のOleDbCommandコマンド= conn.CreateCommand(); command.CommandText = GetSQLStatement(); listing.DataSource = command.ExecuteReader (); listing.DataBind(); – Phill

+0

すべての接続で同じことをしているRNDの良いキャッチ - 私はそれを示唆するつもりでした:-) –

0

同じシード値を毎回使用される新しい接続に対してACE /ジェットRND機能を実行する場合、私はSELECT内

SELECT * FROM 
    (SELECT DISTINCT m.MemberID, RND(m.MemberID) as SortOrder, m.Title, 
    m.FullName, m.Address, m.Phone, m.EmailAddress, m.WebsiteAddress 
    FROM Members AS m 
    INNER JOIN MembersForType AS t ON m.MemberID = t.MemberID 
    WHERE 
     (Category = 'MemberType1' OR Category = 'MemberType2')) as Members 
ORDER BY 
    Members.SortOrder DESC 
+0

私はそれを無駄にしようとしました。同じ結果。ページがロードされた回数に関係なく、Webサイト上で同じ順序で(前とは異なる順序で)結果を取得します。 Accessでは、毎回異なる結果が表示されます。 – Phill

0

あなたは薄暗いが整数= Now.Millisecond

finalQueryとして= DateTime.Now

薄暗いmillSecのDateTimeとして今

RNDフィールドに1つの引数として時間を使用することができます= "SELECT * FROM wordInfo ORDER BY Rnd(" + millSec.ToString( "N")+ "、0))* [ID])"

ここで日付と時刻の値から、ミリ秒値これは整数になり、SQLクエリで丸められて使用されます。

wordInfoは IDこれは、すべての時間(ミリ秒の値が異なるため)、それ同じ接続または新しい接続することをランダムな順序を与え、データベーステーブル

の列名テーブル名です。

関連する問題