2011-08-29 4 views
3

번호 필드와 텍스트 필드가있는 Access 테이블이 있습니다.Access 및 .NET에서 숫자 정렬

나는이 같은 쿼리를 실행할 수 있습니다

Private Sub GetData()  
    Using cnDB As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Path) 
     cnDB.Open() 
     Dim SQL As String = "SELECT * FROM Table ORDER BY intID ASC" 
     Dim cmd As New OleDbCommand(SQL, cnDB) 
     Dim dr As OleDbDataReader = cmd.ExecuteReader() 
     While dr.Read() 
      lst.Items.Add(dr.Item("intID") & " - " & dr.Item("strName")) 
     End While 
     cnDB.Close() 
    End Using 
End Sub 

나는 아이템을 얻을 :

SELECT * FROM Table ORDER BY intID ASC 
//outputs 1,2,3,10 

을하지만이처럼 .NET 인 OleDB 클라이언트를 통해 동일한 쿼리를 실행하려고하면 1,10,2,3 순입니다.

여기에 무슨 일이 일어나고 있으며 어떻게 데이터를 "자연적으로"(1,2,3,10) 두 위치에 정렬 할 수 있습니까?

답변

4

명시 적으로 정수가 아닌 문자열로이 치료에 액세스에게

SELECT * FROM Table ORDER BY CInt(intID) ASC 

을 시도합니다. 분명히 OleDbClient의 일부는이 필드를 문자열 (텍스트 필드)로보고 그에 따라 정렬합니다.

+0

... "무엇인가"는 @ 리피드 코세시가 지적한 것 같습니다. – David

+0

당신은 맞지만 "뭔가"는 내가 넣었던 ListBox의 설정에서 잘못 설정된 값이었습니다. – Riddari

3

문제가 연결 문자열로 의심됩니다. Access 데이터베이스에 연결하고 IMEX=1을 연결 문자열에 포함하는 경우 공급자는 모든 데이터를 string으로 처리합니다. 따라서 순서는 문자열 값에 따라 정렬되며 intID을 정수로두고 숫자 순서로 정렬하는 대신 1, 10, 2, 3을 제공합니다.

+0

와우. 나는 연결 문자열에서 IMEX 옵션에 대해 들어 본 적이 없다. +1은 처음부터 그런 것을 아는 것입니다. – David

+0

@David : 공급자가 Excel을 지원하기 때문입니다. Excel을 지원하려면 실제로 DB가 아니기 때문에 "혼합 유형"열을 처리하는 방법이 필요합니다. 공급자는 기본적으로 10 행의 데이터를 확인하고이를 사용하지만 IMEX는 모든 것을 텍스트로 처리하여 오류를 방지합니다. 나는 그것을 위해 무엇이 있는지 모른 채 많은 사람들이 그들의 연결 문자열 (Access에서도)을 주위에 복사하는 것을 본다 ... –

+0

고마워! 나는 그것을 보자 마자 그것을 봤다. 나는 새로운 것을 여기에서 배우는 것을 좋아한다! – David

0

어휘 (알파벳순) 주문이있는 것 같습니다. 데이터베이스 또는 쿼리에서 무언가가 숫자 형식 대신 varchar/text 열 형식으로 생각되면 올바를 것입니다.

관련 문제