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;
}
나는 진정한 문제를 숨기고 있다고 생각하는 소음이 많습니다. 진정한 문제를 쉽게 찾을 수 있도록 코드 (문자열 연결, 경로 생성, 파일 읽기, 메소드 리팩토링)를 단순화 할 수 있습니까? –
처음부터 쓰기를 원하십니까? 무료 또는 상업용 DBF 편집기가 많이 있습니다 ... – Oleg