2014-09-05 6 views
0

Visual FoxPro OLE DB 공급자 (VFPOLEDB.1)를 사용하여 FoxPro .DBF를 읽는 .NET 응용 프로그램을 C#에서 작성했습니다.거대한 FoxPro .DBF 읽을 때 .NDX/.CDX 인덱싱을 사용하려면 어떻게 VFPOLEDB 공급자를 사용합니까?

문제는 .DBF가 900MB이므로 FoxPro에서 즉시 읽는 것과 비교하여 간단한 읽기가 너무 오래 걸립니다 (우리는 DOS FoxPro를 사용합니다). 공급자와 네이티브 FoxPro 검색의 차이점은 FoxPro가 인덱싱 파일 (.CDX 및 .NDX를 사용)을 사용한다고 가정하고 공급자가 주어진 SQL 문과 함께 일종의 선형 검색을 수행한다는 것입니다.

public DataTable getData(string refNum = "TESTREFNUM") 
{ 

    DataTable result = new DataTable(); 

    OleDbConnection connection = new OleDbConnection(
      "Provider=VFPOLEDB.1;Data Source=C:\\PATH\\TO\\DBFFILES\\;Exclusive=No"); 

     connection.Open(); 

     if (connection.State == ConnectionState.Open) 
     { 
      string mySQL = "SELECT DP_PRO, DP_FILE, DP_NUM" 
       + "FROM DISPATCH"       // 900MB dispatch.dbf 
       + "WHERE DP_PRO LIKE '%" + refNum + "%'"; 

      OleDbCommand MyQuery = new OleDbCommand(mySQL, connection); 
      OleDbDataAdapter DA = new OleDbDataAdapter(MyQuery); 

      DA.Fill(result); 

      connection.Close(); 
     } 
    return result; 
} 

내 연구에서 .NDX 파일보다 .CDX 파일에 대한 지원이 더 많았습니다. 그러나 파일을 통한 기본 느린 검색 외에 인덱싱을 사용하도록 OleDBConnection을 설정하는 방법은 무엇입니까?

SQL 문을 변경해야합니까? 아니면 공급자? 또는 DBF 파일에서 변경할 설정? 연구 결과에 따르면 .CDF 참조는 .DBF 파일의 헤더에 있으므로 공급자가 어떤 .CDX 파일이 연관되어 있는지를 알면 문제가되지 않습니다.

어떤 도움이 이라고 크게이 될 것입니다. 저는 FoxPro 경험이없는 최근 졸업생입니다. : p

+0

당신의 질문은'.NDX' 또는'.CDX '사용과 관련이 있습니다. 전자는 수동으로 열어야하며 DB에 대해 SQL 쿼리를 사용할 때는 IIRC가 사용되지 않습니다. 후자는 데이터베이스가 열릴 때 자동으로 열리고 SQL 쿼리가 실행될 때 적절한 인덱스가 자동으로 사용됩니다 (있는 경우). (귀하의 제목은 .NDX/.CDX 둘 다 언급합니다. 쿼리가 실행될 때 SQL 쿼리에서 사용중인 데이터베이스에 대해 어느 것이 구체적으로 사용되고 있는지 알고 싶습니다.) –

+0

인덱스를 설정할 수 있습니다. .NDX 또는 .CDX 데이터베이스에 내 질문은 Ole DB 중 하나를 지원했는지 여부 및 여부를 사용할 수 있습니다. 대답과 연구에서, 나는 CDX가 더 나은 지원을하고 자동으로 사용되는 것을 보았습니다. –

+0

또한 귀하의 질문에 대답하기 위해, 내가 작업하고있는 데이터베이스는 색인을 생성하는 필드 사이에 일부 중복이있는 .NDX 및 .CDX 색인을 모두 가지고 있습니다. –

답변

2

복합 인덱스 (CDX)의 관점에서 쿼리가 Rushmore 최적화되어 있는지 확인하고자합니다. 그게 전부 당신이해야 할 일이야 - 문제의 테이블에 대한 CDX가 (DBF의 헤더에 표시된대로) 다음 자동으로 사용됩니다. 위의 예제를 보면, 따라서 필드 DP_PRO에 인덱스 태그가 없다는 가정이 있습니다.

+0

와우! 방금 SQL 문에서 두 개의 와일드 카드 '%'가 검색 속도를 늦추는 것을 알았습니다. 사용자가 입력 할 수있는 값으로 제한됩니다. 이제는 정확한 값이어야하지만, 프로그램이 더 빠르면 바로 처리해 드리겠습니다. 고마워 앨런. –

+0

그 유형의 쿼리는 최적화되어야하지만 인덱스를 특정 방식으로 구성해야 할 수도 있으므로 이상합니다. 대답으로 표시 하시겠습니까? :) –

-2

VFPOLEDB 공급자는 인덱스를 전혀 지원하지 않습니다.

+0

이 소유권 주장을 뒷받침 할만한 자료가 있습니까? Alan B의 답변과 첨부 된 주석은 다르게 나타냅니다. (INDEX는 [지원되는 OLE DB 명령 목록]에도 있습니다. (http://msdn.microsoft.com/en-us/library/80x51c04%28v=vs.80%29.aspx) – DougM

+0

SQL 및 VFPOLEDB를 통한 색인. 그러나 [this] (http://social.msdn.microsoft.com/Forums/en-US/770c9e5a-8c42-4cdb-bfbb-6894d80c12b3/how-to-tell-if-a- – Oleg

+0

VFPOLEDB를 통해 * 색인을 생성하기가 어려울 수도 있지만, "색인을 지원하지 않습니다."와는 다릅니다. 모든 "; 이미 존재하는 인덱스는 SQL 쿼리를 최적화하는 데 사용될 수 있습니다. –