我需要读写dbf文件。 Microsoft在Office 2013中放弃了对此的支持。
我正在尝试使用OLEDB。我在这一点上遇到的问题(还没有进入写作)是当我读取标题信息时,我按照字母顺序返回排序,而行没有像那样排序。我需要以相同的顺序保存它们,以便我可以返回并创建一个dbf文件(在一些数据处理之后)以传递回我需要DB的遗留应用程序。
这是内部分发,因此如果需要,我可以负责拥有正确的.NET库。我找不到任何解决这个问题的参考资料而是使用.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;
}
答案 0 :(得分:0)
你提到.dbf文件,但它们真的是dBASE 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"]
}
不,不是确切的代码,但很容易使用。构建用于推送数据的命令也很容易。但是,如果你的重要内容是将内容写出来...你是否真的试图重写表并将所有内容重新转换为字符串?
关于太多噪音的另一个评论是准确的...总之,是的,微软放弃了对任何事情的支持,但你想做什么。