2009-03-26 2 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에서 실행할 때마다 임의의 정렬 순서에 따라 매번 다른 순서로 행을 반환합니다. 그러나 웹 응용 프로그램을 통해 실행할 때마다 행은 매번 같은 순서로 반환됩니다. 여기에 내 코드 숨김에서 호출하는 방법이다 : 나는 어쩌면 쿼리가 캐시되고 있다고 생각하지만 결과는 동일하기 때문에

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; 
    } 
} 

내가 캐싱에 대한 모든 것들에 추가. 코드에 중단 점을 넣어 쿼리가 위와 동일하다는 것을 확인했습니다.

아이디어가 있으십니까? 이것은 나를 미치게합니다. 동일한 시드 값마다 사용되는 새로운 연결에 대해 ACE/제트 RND 함수 실행시

+0

동일한 임의 순서로 반환되었거나 표시되는 순서에 지능이 있습니까? –

+0

동일한 임의의 순서로 표시됩니다. – Phill

+0

나는 이것을 문제 해결에 관한 것이지 대답이 아니므로 주석에 넣겠다.하지만 웹 버전의 select 절에 "RND (members.MemberID)"를 추가하여 그 동일한 무작위가 반환되는지 확인해 보았다. 번호 매번? 한 가지 생각은 결과를 캐싱하여 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에서는 수행 할 수 없다고 생각합니다. 한 가지 해결 방법은 ACE/Jet NOW() niladic 함수의 최하위 소수 부분을 사용하는 것입니다. 뭔가 같은 :

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

제가

내부 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

나는 아무 쓸모가 없어 보았습니다. 같은 결과. 페이지가로드 된 횟수와 상관없이 웹 사이트에서 동일한 순서 (이전과는 다른 순서 임에도 불구하고)로 결과를 얻습니다. Access에서는 매번 결과가 다르게 주문됩니다. – Phill

0

당신은 이제 RND 필드

희미한 하나 개의 인수로 시간을 사용할 수있는 날짜 시간 = DateTime.Now

희미한 millSec으로 정수 = Now.Millisecond

finalQuery로 = "SELECT * FROM wordInfo ORDER BY Rnd ("+ millSec.ToString ("N") + ", 0)) * [ID])"

이렇게 날짜와 시간 값에서, 밀리 초 값 이것은 정수가되고 SQL 쿼리에서 반올림하여 사용됩니다.

wordInfo는 ID이 모든 시간 (밀리 초 값이 다르기 때문에) 동성 연결 또는 새로운 연결 수를 임의의 순서로 제공 데이터베이스 테이블

의 열 이름 테이블 이름이다.

관련 문제