【问题标题】:Accessing Visual Fox Pro DBF with python使用 python 访问 Visual Fox Pro DBF
【发布时间】:2020-10-09 13:12:37
【问题描述】:

好的,我们的会计软件使用 VFP。是的,我知道它很旧。

他们正在更新到 Microsoft SQL 数据库……但我还没有。

我已经尝试了所有方法来使用 python 获取数据。这是我想出的最好的(下),但它的速度很慢。一个 DBF 文件将近 2gb,这是不行的。

任何人都知道更好的解决方案,理想情况下我可以使用 SQL 查询它,但没有 64 位 VFP 驱动程序。

帮帮我。

from dbfread import DBF
import datetime
import os
df = DBF("E:/Opera3VFP/Data/l_stran.dbf")


order_list = ["Reference, Date, Tr Type, Customer Reference, Value, Vat"]

for rec in df:    
    if rec["ST_ACCOUNT"] == "CDL2" and rec["ST_TRDATE"] >= datetime.date.today() - datetime.timedelta(days=5):
        order_list.append(f'{rec["ST_TRREF"]}, {rec["ST_TRDATE"]}, {rec["ST_TRTYPE"]}, {rec["ST_CUSTREF"]}, {rec["ST_TRVALUE"]}, {rec["ST_VATVAL"]}')

【问题讨论】:

  • 有32位VFPOLEDB驱动。
  • 由于某种原因对我不起作用
  • 什么不适合你?在您的代码中,您只需过滤给定帐户和过去 5 天。这不是您在代码中尝试以最糟糕的方式执行的操作吗?我不是 python 用户,因此不知道如何使用 python 的 OLEDB 驱动程序。如果你想要一个示例,比如 C# 或 Go,那么我可以给你。
  • 问题是,我正在实施的当前方法是逐行读取文件,而且速度极慢。我可以使用 OLEDB 驱动程序等,但是当我尝试使用 32 位 VFP 驱动程序时,它会抱怨“指定的 DSN 包含驱动程序和应用程序之间的体系结构不匹配”。执行基本查询所需的时间太长。我在 VBA 中做了类似的事情,需要几秒钟,这种方法更像是 30 秒。
  • @CetinBasoz 话虽这么说,但出于兴趣,我会对如何用 C# 编写它的示例感兴趣。

标签: python sql odbc visual-foxpro


【解决方案1】:

(这将是一个混乱的评论) C# 示例 - (在使用阅读器的代码中,但还在 cmets 中添加了对 DataTable 的加载):

void Main()
{
    //DataTable tbl = new DataTable();
    using (OleDbConnection cn = new OleDbConnection(@"Provider=VFPOLEDB;Data Source=E:\Opera3VFP\Data"))
    using (OleDbCommand cmd = new OleDbCommand(@"select ST_TRREF, ST_TRDATE, ST_TRTYPE, ST_CUSTREF, ST_TRVALUE, ST_VATVAL 
        from l_stran
        where ST_ACCOUNT == ? and 
            ST_TRDATE >= ?",cn))
    {
        cmd.Parameters.Add("@account", OleDbType.VarChar).Value = "CDL2";
        cmd.Parameters.Add("@date", OleDbType.Date).Value = DateTime.Today.AddDays(-5);

        cn.Open();
        //tbl.Load(cmd.ExecuteReader());

        // using a reader
        var rdr = cmd.ExecuteReader();
        while (rdr.Read())
        {
            // do whatever with the row read
        }
        // using a reader
        
        cn.Close();
    }
    // do whatever with tbl
}

如果您在 ST_ACCOUNT 和 ST_TRDATE 上有索引,这将非常快(假设没有意外的数据分布 - 即:90% 的数据属于 ST_ACCOUNT:CDL2)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多