首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >读取dbf文件

读取dbf文件
EN

Stack Overflow用户
提问于 2014-05-20 01:35:03
回答 1查看 1.7K关注 0票数 0

我需要读写dbf文件。微软在Office 2013中放弃了对此的支持。

我正在尝试使用OLEDB。我在这一点上遇到的问题(还没有进入写作)是,当我读取标题信息时,我会按字母顺序返回它,而行并不是这样排序的。我需要以相同的顺序保存它们,以便我可以返回并创建dbf文件(在一些数据处理之后),以传递回需要DB的遗留应用程序。

这是为了内部分发,所以如果需要的话,我可以注意拥有正确的.NET库。我找不到任何解决这个问题的参考资料,我宁愿使用.NET技术,也不愿从头开始编写dbf……

如果以前有人回答过这个问题,我很抱歉。如果有人指出我完成这项任务的正确方法,我将不胜感激。

遵循的代码

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

发布于 2014-05-20 20:43:38

你提到了.dbf文件,但它们真的是dBASE 5还是仅仅是你能得到的一个连接。我个人就用过微软的Visual Foxpro OleDb provider。你可以建立连接,查询表,构建参数化的select,insert,update,delete,而不需要真正了解header之类的东西。

关于连接到dbf表之类的东西有很多问题,但我通常使用OleDbDataAdapter,将我的命令放在其中执行,并通过.Fill()将数据拉到DataTable对象中。

然后我就可以做像这样的事情

代码语言:javascript
复制
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"]
}

不,不是确切的代码,但使用起来很简单。构建推送数据的命令也很容易。但如果你最重要的是把内容写出来...您真的要重写表并将所有内容重新转换为字符串吗?

另一个关于噪音过多的评论是准确的。总而言之,是的,微软放弃了对任何东西的支持,但你想做什么呢?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23743839

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档