2013-10-03 7 views
1

* .dbf (dBase IV) 파일을 사용하여 필요한 쉐이더 데이터 (쉐이프 파일)를 가져 오려고합니다.dBase IV에 이상한 오류가있어서 테이블 개체로 * .dbf를 얻을 수 없습니다.

이상한 점은 dBase JET OleDb 4.0 공급자가 그런 개체가 없다는 것을 말하고 있지만 존재합니다!

증명 :

http://s21.postimg.org/eaj4h91uv/image.png

는 소스 코드 : 당신이 좋은 연결 문자열을 것으로 나타남

static void Test() 
    { 
     const string path = "C:\\buildings.dbf"; 
     string conStr = String.Format("Provider = Microsoft.Jet.Oledb.4.0; Data Source = {0}; Extended Properties = \"dBase IV\"", Path.GetDirectoryName(path)); 

     var connection = new OleDbConnection(conStr); 
     connection.Open(); 

     var command = new OleDbCommand(string.Format("select NAME from {0}", Path.GetFileName(path)), connection); 

     using (var reader = command.ExecuteReader()) 
     { 
      while (reader.Read()) 
      { 
       var str = (string)reader["NAME"]; 
      } 
     } 

     connection.Close(); 
    } 

    static void Main() 
    { 
     try 
     { 
      Test(); 
     } 
     catch (Exception exc) 
     { 
      Console.WriteLine(exc); 
     } 
    } 
+0

작은 경로가 들리지만 로컬 경로와 일치하는 생성 된 경로를 확인 했습니까? – Sakthivel

+0

@codebrain proof는 스크린 샷에 있습니다. 연결 문자열은 JET/dBase 공급자가 path-file이 아닌 path-folder를 정확히 사용하고 SQL 쿼리 본문에서 파일을 정확하게 사용해야합니다. 'select SOMEFIELD from file.dbf' –

답변

1

가 ... 연결 문자열은 PATH를 가리켜 야 만 곳 .dbf 파일이 있습니다. 그러나 C : \ MIGHT의 ROOT에이 .dbf 파일을 가지고 테스트하는 경우에도 문제가 될 수 있습니다. 나는 그 파일을 C : \ TEST \와 같은 루트 폴더의 하위 폴더로 옮깁니다. buildings.dbf

다음 번 쿼리는 현재 "경로"에 대해 열려 있으므로 해당 경로의 .dbf 테이블을 볼 수 있습니다. 당신 만이 필요합니다

var command = new OleDbCommand("select NAME from buildings", connection); 

".dbf"는 질의를 위해 암시됩니다. 문제를 야기 할 수있는 유일한 다른 문제는 'NAME'이 예약어이므로 name (틱)이 감싸 져 있어야 실제 열 이름과 예약어를 알 수 있기 때문일 수 있습니다.

다른 제공 업체가 틱 마크에 문제가있을 수 있으므로 [이름] 대괄호로 묶어야합니다.