- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我使用 Delphi/C++Builder XE2。
我至少需要访问这些DBMS:
我需要在数据感知可视控件中显示和编辑数据。 数据可以驻留在这些 DBMS 中的任何一个上,我将在外部文本文件上配置连接属性和 SQL 语句。
所以我正在寻找一组用于数据库访问的组件,它支持此类 DBMS 并且具有良好的性能,类似于旧的 Paradox 表。
BDE (Borland 数据库引擎) (TDatabase
, TTable
...)
已弃用。
DBX(Embarcadero dbExpress)(TSQLConnection
,TSQLTable
...)
替换 BDE,单向数据集(光标只向前移动;不在内存中缓冲数据,这样的数据集不能在 DBGrid 中显示;要使用 dbExpress 构建用户界面,您将需要使用另外两个组件:TDataSetProvider
和 TClientDataSet
)
使用 native 驱动程序(HANA 没有)或 ODBC。
FireDAC (Embarcadero Fire 数据访问组件)(TADConnection
、TADTable
...)
这是AnyDAC的延续;使用 native 驱动程序(HANA 没有)或 ODBC 或 dbExpress。
UniDAC (Devart 通用数据访问组件)
不是免费的;使用 native 驱动程序(HANA 没有)或 ODBC 或“数据库客户端”。
DA(RemObjects Data Abstract 用于 Delphi)
不是免费的。
ZDBC (Zeos 数据库连接接口(interface))(TZConnection
、TZQuery
...)
开源;开始作为 JDBC 到 Object Pascal 的端口;不提供与数据感知可视化控件的绑定(bind)。
dbGo (Embarcadero dbGo) (TADOConnection
, TADOTable
...)
实现 ADO(因此在 OLE DB 和 ODBC 之上)。有许多怪癖,例如在查询中重复使用同名参数。
Jv BDE (TJvQuery
, TJvBDESQLScript
...)
相应标准库的增强。
Jv 数据访问(TJvADODataset
、TJvADOQuery
...)
相应标准库的增强。
(随意增强此列表)
所以我的选择是:
最佳答案
我决定进行一些性能研究:UniDAC (5.0.1) 与 FireDAC (8.0.1),在 Delphi XE3 上。数据库:Firebird、MySQL 和 SQL Server。
这里是 150k 记录的抓取结果(内存使用被认为是抓取前后的差异)。
Firebird :
CREATE TABLE TEST_PERF (
ID INTEGER PRIMARY KEY,
VC VARCHAR(200),
NM NUMERIC(18,2),
DT TIMESTAMP
)
UniDAC - 0,909 秒,占用 12 324 044 内存
FireDAC - 0,967 秒,占用了 282 179 668 内存(我很震惊)
MySQL:
CREATE TABLE TEST_PERF (
ID INTEGER PRIMARY KEY,
VC VARCHAR(200),
NM NUMERIC(18,2),
DT DATETIME
)
UniDAC - 0,363 秒和 11 552 604 内存
FireDAC - 0,713 秒和 49 375 108 内存
SQL服务器:
CREATE TABLE TEST_PERF (
ID INTEGER PRIMARY KEY,
VC VARCHAR(200),
NM NUMERIC(18,2),
DT DATETIME
)
UniDAC - 0,391 秒和 14 155 576 内存
FireDAC - 0,324 秒和 51 775 844 内存
一切都经过简单测量:
function MemoryUsed: Cardinal;
var
st: TMemoryManagerState;
sb: TSmallBlockTypeState;
begin
GetMemoryManagerState(st);
Result := st.TotalAllocatedMediumBlockSize + st.TotalAllocatedLargeBlockSize;
for sb in st.SmallBlockTypeStates do
Result := Result + sb.UseableBlockSize * sb.AllocatedBlockCount;
end;
UniQuery1.SQL.Text := 'select * from test_perf';
UniQuery1.SpecificOptions.Values['FetchAll'] := 'True';
mem := MemoryUsed;
tc := Now;
UniQuery1.Open;
UniQuery1.Last;
tc := Now - tc;
mem := MemoryUsed - mem;
Memo1.Lines.Add('UniDAC Firebird: Time: ' + FloatToStr(tc * 24 * 60 * 60) + ' sec; Memory used: ' + IntToStr(mem));
ADQuery1.SQL.Text := 'select * from test_perf';
ADQuery1.FetchOptions.Mode := fmAll;
mem := MemoryUsed;
tc := Now;
ADQuery1.Open;
ADQuery1.Last;
tc := Now - tc;
mem := MemoryUsed - mem;
Memo1.Lines.Add('FireDAC Firebird: Time: ' + FloatToStr(tc * 24 * 60 * 60) + ' sec; Memory used: ' + IntToStr(mem));
如果有人感兴趣,这里是test application ,您可以在其中添加 ADO、dbExpress、ZeosLib 和您感兴趣的其他软件的性能比较。
关于database - 从 Delphi XE2 高效访问各种 DBMS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16016700/
是否有一个java库能够将数据库从任何DBMS(Mysql,SQLServer,Oracle,SQLite,...)导出到任何DBMS? 最佳答案 这并不容易..但您可以尝试使用 apache tor
我正在寻找令人满意的选项来对我的 .NET DAL 类进行单元测试;由于它们是 DAL 类,因此它们直接使用 ADO.NET 访问数据库。目前,我使用 MSSQL 数据库的实例进行测试,但想知道有哪些
假设我有以下关系(表): 学生(身份证、姓名、家庭) 类(class)(id、标题、单位、引用) Std-Course (std-id, course-id)//std-id 和 course-id
假设我有一个表 Table1,其中包含属性 id、姓名、地址、薪水。现在,我编写以下查询: SELECT * FROM Table1 WHERE 2*Salary > (SELECT MAX(Sala
我们正在为场馆开发支付系统。现在我们正在考虑为我们的应用程序使用什么 DBMS。目前我们正在使用微软的 sql express 来存储我们的数据。但是因为该系统将在非常繁忙的场所使用,我们认为我们需要
接受这个查询: SELECT * FROM MyTable WHERE MyColumn = 'SomeValue' ORDER BY SomeFakeQualifier.MyCol
我需要一个 DBMS,但不知道该选择哪个。基本上,应用程序进行许多 INSERT/UPDATE,但也进行许多 SELECT。 SELECT 大多非常简单,只有一个字段。 我目前正在使用 MySQL +
这里有人可以澄清“DBMS”和“数据库服务器”之间的区别吗?还有,'MySQL'是数据库查询语言的名称还是DBMS的名称? 最佳答案 DBMS 代表数据库管理系统(参见维基百科 http://en.w
我们知道: A schedule in which transactions are aligned in such a way that one transaction is executed fi
我刚刚阅读了 DBMS 中 3NF 的定义,它指出: 函数依赖 X --> A 是允许的,如果:1. X 是 super 键。2. A 是某个键的一部分。 我有两个疑问: a:我不明白第二个条件对消除
几年来,我一直沉浸在 MsSql/MySql 的世界里,我决定再展翅飞翔。目前,我正在研究哪种 DBMS 擅长归档数据时所需的事情。例如。大量写入和低读取。 我已经看到了 NoSQL 运动,但我有一个
好的..我已经对此进行了研究,但我对此研究得越多,我就越感到困惑。所以想到在这里发帖。 DBMS 提供数据库服务器功能 DBMS 有一个服务器组件和一个客户端组件 DBMS = 数据库服务器软件 DB
如果我们使用外部过程,我可以用其他语言执行一些代码,我想使用一些数值方法库来做一些矩阵计算并将结果存储在 SQL、Oracle 或任何 DBMS 中,这可能吗? 也许在 SQL 中有一个表,并告诉外部
Augmentation功能依赖性中的规则指出 当 X -> Y 时, 然后是 XZ->YZ。 有人可以举一个真实世界的例子吗? 最佳答案 如果 X 是客户 ID,Y 是客户姓名,Z 是出生日期,则:
我想知道哪些 DBMS 在其查询计划/执行中实际使用了多线程? 最佳答案 Oracle 支持这一点,SQL Server 和 DB2 也是如此。不过,我不认为 MySQL 或 PostgeSQL 支持
数据库管理系统(尤其是MySQL)对表的最大行数有限制吗? 我想创建用于保存日志文件的表,它的行数增加得如此之快,我想知道我应该怎么做才能防止出现任何问题。 最佳答案 我认为没有官方限制,这将取决于最
因此,我正在努力思考整个“规范化”的问题。为了更好地理解它,我想出了一个存储歌曲的案例 假设我有以下数据库: 专辑表: album_name| genre album_1|
DBMS 中的空值代表什么? 是未赋值还是不适用还是零还是空格? 最佳答案 Null 是 SQL 中用来表示数据库中不存在数据值的特殊标记。由关系数据库模型的创建者 E. F. Codd 引入,SQL
DBMS 如何利用撤消缓冲区和重做日志文件来恢复对数据库所做的更改? 最佳答案 例如在 Oracle 上,重做日志文件记录由于事务和内部 Oracle 服务器操作而对数据库所做的更改。并且这些文件保护
是否有任何开源分层数据库或现有 RDBMS 之上的仿真? 我正在搜索一个 DMBS(或现有 RDBMS 的插件),它可以存储分层数据并允许对分层数据执行查询(类似于“SELECT LEVEL ...
我是一名优秀的程序员,十分优秀!