1

在我的应用程序中,我想使用文件来存储数据。我不想使用数据库或明文文件,目标是保存双精度值和整数值以及字符串,以识别记录的名称;我只需要在磁盘上保存数据以生成报告。文件甚至可以增长到千兆字节。您建议使用什么格式?二进制?如果是这样,您知道哪个 vcl 组件/库好用?我的目标是创建一个创建和更新文件的应用程序,而另一个工具将“吃掉”这些文件,为用户按需生成漂亮的 pdf 报告。你怎么看?有什么想法或建议吗?

提前致谢。

4

5 回答 5

4

如果您不想重新发明轮子,您可以从我们这边找到所有需要的开源工具来完成您的任务:

使用完整的源代码,从 Delphi 6 到 XE。

我刚刚更新了框架的文档。超过 600 页,包含每个类方法的详细信息,以及新增强的一般介绍。请参阅 SAD 文档。

更新:如果您打算使用 SQLite,您应该首先猜测数据将如何存储,要创建哪些索引,以及 SQL 查询如何加快您的请求。读取每个请求的所有文件内容是一个坏主意:您应该更好地构建数据,以便单个 SQL 查询能够返回已花费的结果。有时,对数据使用附加值(如临时总和或平均值)是个好主意。还可以考虑使用SQLite3 的 RTree 虚拟表,该表专用于加速对double最小/最大多维数据的访问:它可能会大大加快的请求。

于 2011-04-29T05:52:27.470 回答
2

您不想使用完整的 SQL 数据库,并且认为纯文本文件过于简单。

介于两者之间的点包括:

  1. 不是完整的 SQL 数据库,而是更多的键值存储,从技术上讲不是平面文件,但它确实提供了一个“键+值”列表,可以在单个主键上快速搜索。比如BSDDB。它的名称中有字母 D 和 B。在您看来,这是否使它成为一个数据库?因为它不是关系数据库,也不做 SQL。它只是一种二进制键值(哈希表)blob 存储机制,使用一种易于理解的二进制文件格式。就个人而言,我不会开始一个新项目并使用该类别中的任何东西。

  2. 推荐:使用 SQL 但不如独立 SQL 数据库服务器大的东西。例如,您可以使用 SQLite 和delphi 包装器。它经过了很好的测试,并在许多 C/C++ 和 Delphi 应用程序中使用,并且比你自己可以滚动的任何东西都更值得信赖。它是一个非常轻量级的嵌入式数据库,受到许多人的信任。

  3. 推出您自己的 ISAM 或 VLIR,它最终会随着时间的推移演变成您自己的内部 DBMS。涉及多个文件,并且有索引,因此您可以快速查找数据,而无需将所有内容加载到内存中。不建议。

  4. 最扁平的二进制固定记录长度文件。你最初在你的问题中提到,power basic 有一个叫做随机访问文件的东西,然后你从你的问题中删除了它。可能是您正在寻找的东西,尤其是作为主要操作的仅追加写入。滚动您自己的 TurboPascal 时代的“记录文件”。如果使用“FILE OF RECORD”类型,则会达到 2gb 的限制,并且 Unicode 存在问题。所以使用 TStream 代替,像这样. 二进制文件格式对它们有很多影响,特别是因为随着时间的推移很难增长和扩展二进制文件格式,而不会破坏您读取旧文件的能力。这就是为什么我建议您从一开始可能看起来有点过分杀伤力 (SQLite) 而不是推出自己的二进制解决方案的关键原因。

    更新 2:在更新问题以提及 PDF 以及听起来像是报告系统要求的内容后,我认为您确实应该使用真正的数据库,但也许是一个小型且易于使用的数据库,例如 firebird 或 interbase。)

于 2011-04-28T15:36:38.887 回答
1
  1. 定义 API 以使用您的平面文件,以便 API 可以通过单独的数据层以多种方式实现。
  2. 使用标准嵌入式 SQL 数据库(例如 SQLite 或 Firebird)实现 API。
  3. 仅当标准解决方案有问题时,请考虑您自己的解决方案。
于 2011-04-28T16:13:34.610 回答
1

我建议使用TClientDataSet ,并通过生成程序使用它的SaveToFile() / SaveToStream()方法,并为将“消耗”数据的程序使用LoadFromFile() / LoadFromStream()方法。这样,您仍然可以在不连接到任何外部数据库的情况下创建索引记录,同时将交换数据保存在单个文件中。

于 2011-04-28T15:47:45.630 回答
0

我使用 KBMMemtable - 请参阅http://www.components4developers.com/ - 快速、可靠、存在很长时间 - 支持二进制和 CSV 流进出文件,以及索引、过滤器和许多其他好东西 - TClientDataSet不会很好地处理大型数据集。

于 2011-04-30T03:54:29.090 回答