2014-05-19 5 views
0

dbf 파일을 읽고 쓰는 것이 필요합니다. Microsoft는 Office 2013에서이 문제에 대한 지원을 중단했습니다.dbf 파일 읽기

OLEDB를 사용하려고합니다. 이 시점에서 내가 겪고있는 문제는 (글을 쓰지 않고) 헤더 정보를 읽을 때 행이 정렬되지 않은 것처럼 알파벳 순으로 정렬 된 결과를 반환한다는 것입니다. DB를 필요로하는 레거시 애플리케이션으로 돌아가려면 dbf 파일 (일부 데이터 처리 후)을 만들 수 있도록 같은 순서로 저장해야합니다.

이것은 내부 배포 용이므로 필요한 경우 올바른 .NET 라이브러리가 있어야합니다. 이 문제를 해결할 수있는 참조를 찾을 수 없으며 dbf를 처음부터 작성하는 것보다는 .NET 기술을 사용합니다 ...

이전에이 답변을 받았으면 사과드립니다. 지적 해 주시면 고맙겠습니다. 이 작업을 수행하는 정확한 방법으로

코드는 .dbf 파일에 언급

if (intype == 6) //dbase 
{ 
    int rowCount = 0; 
    int colCount = 0; 
    string npath = filein; 
    i = npath.LastIndexOf("\\"); 
    aux2 = MySubStr(npath, i + 1, 1); // directory --- internal library 
    auxstr = MySubStr(npath, i + 1, 2); 
    i = auxstr.IndexOf("."); 
    if (i > -1) 
     auxstr = MySubStr(auxstr, i, 1);       
    DataSet ds = new DataSet(); 
    OleDbConnection connection; 
    string connstr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source = '"; // I can change this to proper library 
    connstr = string.Concat(connstr, aux2); 
    connstr = string.Concat(connstr, "';"); 
    connstr = string.Concat(connstr, "Extended Properties='dBASE 5.0';"); // again not worried about DBASE 3 or 4 
    connection = new OleDbConnection(connstr); 
    try 
    { 
     connection.Open();        
     DataTable dbSchema = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, new object[] { null, null, auxstr, null }); 
     i = 0; 
     foreach (DataRow rownm in dbSchema.Rows) 
     { 
      header[i] = rownm["COLUMN_NAME"].ToString(); 
      myDT[i++] = rownm["DATA_TYPE"].ToString(); // not using at this point... will be used when writing dbfs 
     } 
     colCount = i; 

     aux2 = "Select * from "; 
     aux2 = string.Concat(aux2, auxstr); 
     OleDbDataAdapter da = new OleDbDataAdapter(aux2, connection); 
     da.Fill(ds,"ZDATA"); 
     count = ds.Tables[0].Rows.Count; 
    } 
    catch (Exception e) 
    { 
     auxstr = e.ToString(); 
     messages[cntmsgs++] = auxstr; 
     zcode = 99; 
     logerror(messages, cntmsgs, zcode); 
     return 99; 
    } 
    System.Data.OleDb.OleDbCommand cmd1 = new System.Data.OleDb.OleDbCommand(aux2, connection); 
    OleDbDataReader reader; 
    reader = cmd1.ExecuteReader(); 
    StreamWriter ftmp = new StreamWriter(fileout[0], false, System.Text.Encoding.Default); 

    while (reader.Read()) 
    { 
     if (rowCount == 0) 
     { 
      auxstr =""; 
      for (i = 0; i < colCount -1; i++) 
      { 
       auxstr += "\"" + header[i] + "\","; 
      } 
      auxstr += "\"" + header[colCount - 1] + "\""; 
      ftmp.WriteLine(auxstr); 
      rowCount++; 
     } 
     aux2 = ""; 
     for (i = 0; i < reader.FieldCount; i++) 
     { 
      if (reader.IsDBNull(i)) 
       auxstr = ""; 
      else 
       auxstr = reader.GetString(i); 
      auxstr = "\"" + auxstr + "\""; 
      if (i < reader.FieldCount - 1) 
      { 
       auxstr = string.Concat(auxstr, ","); 
       aux2 = string.Concat(aux2, auxstr); 
      } 
      else 
      { 
       aux2 = string.Concat(aux2, auxstr); 
      } 
     } 
     ftmp.WriteLine(aux2); 
    } 
    ftmp.Close(); 
    reader.Close(); 
    connection.Close(); 
    filein = fileout[0]; 
    intype = 2; // right now forcing additional processing in another block... 
    return 0; 
} 
+4

나는 진정한 문제를 숨기고 있다고 생각하는 소음이 많습니다. 진정한 문제를 쉽게 찾을 수 있도록 코드 (문자열 연결, 경로 생성, 파일 읽기, 메소드 리팩토링)를 단순화 할 수 있습니까? –

+0

처음부터 쓰기를 원하십니까? 무료 또는 상업용 DBF 편집기가 많이 있습니다 ... – Oleg

답변

0

수행 할 수 있지만, 디베이스 5 정말하거나 연결 당신이 얻을 수 있었던 것이 었습니다. 저는 개인적으로 Microsoft의 Visual Foxpro OleDb provider을 활용했습니다. 당신은 연결을 만들 수 있고, 테이블을 쿼리하고, 매개 변수화 된 선택을 만들고, 삽입하고, 업데이트하고, 삭제할 수 있으며 헤더 등에 대해 실제로 알 필요가 없습니다.

dbf 테이블과 연결에 대한 많은 질문이 있지만 일반적으로 OleDbDataAdapter를 사용하여 내 명령을 실행하고 .Fill()을 통해 DataTable 개체로 데이터를 가져옵니다.

그럼 난

foreach(DataColumn dc in MyTable.Columns) 
    [write whatever output of things like dc.ColumnName, dc.Type, etc] 

foreach(DataRow dr in MyTable.Rows) 
{ 
    write out... dr["WhateverColumn"] 
} 

아니, 정확한 코드,하지만 간단한 작업을하는 등의 작업을 수행 할 수 있습니다. 데이터를 다시 푸시하기위한 명령을 작성하는 것도 쉽습니다. 그러나 당신의 큰 거래가 내용을 쓰고 있다면 ... 정말로 테이블을 다시 작성하고 모든 것을 문자열로 재 변환하려고합니까?

너무 많은 소음에 대한 다른 의견은 정확합니다 ... 요약하면 그렇습니다. Microsoft는 무엇이든 지원을 중단했지만 수행 할 작업은 무엇입니까?

+0

시각적 인 foxpro 드라이버에 대한 귀하의 제안에 감사드립니다. 이 프로젝트를 버너에 넣었으니 지금은이 프로젝트를 할 여유가 있습니다. 일부 레거시 소프트웨어를 준비하려면 파일 작업이 필요합니다. 응답 지연에 대해 유감스럽게 생각합니다. – user1555945

관련 문제