Delphi:如何将表结构转换为对象

Posted

技术标签:

【中文标题】Delphi:如何将表结构转换为对象【英文标题】:Delphi: How to get table structure into object 【发布时间】:2012-02-24 08:03:58 【问题描述】:

使用 Delphi,我需要创建一个包含特定表结构(无数据)的类,包括所有字段、约束、外键、索引。目标是拥有“标准”表,比较它们并找出差异。这个东西应该包含在我的大项目中,所以我不能使用任何“外部”比较器。此外,这个功能可能会被扩展,所以我需要有自己的实现。问题是如何检索这些信息,拥有连接字符串并知道特定的表名。正在使用 SQL Server 2008。

【问题讨论】:

虽然the question 不一样,但有人发布了一个答案(带有评论块和所有 SQL 脚本的那个),它检索了所有可能有帮助的表定义、数据库信息等. 没有通用的方法,因此您必须声明一个抽象基础并从特定于 DBMS 的存储中填充实际模式数据(例如:支持 SQL-92 的 DBMS 上的 INFORMATION_SCHEMA)跨度> 使用 TADOConnection.OpenSchema 您将能够获得大部分信息。其他与架构相关的信息可以在 sys 表中找到(取决于您的 sql-sever 版本)。 【参考方案1】:

如果你查看 Delphi 源代码,它是这样完成的:

从 1=2 的表中选择 *

更新

可以使用Information Schema Views 检索元数据,例如约束:

SELECT * FROM databaseName.INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE 
Where TABLE_NAME='tableName' 

【讨论】:

只检索列名,不检索约束、外键、索引和其他元数据。 使用否定的where 条件会浪费大量的 IO 周期,因为它需要在 SQL 解析和执行期间评估条件。例如,firebird 服务器使用 Execute time = 110ms 来获得否定的 where 条件。在执行期间使用select first 0 * from table 会消耗Execute time = 0ms【参考方案2】:

我已经很久没有接触 Delphi,但我确实记得我曾经做过的几件事。喜欢

select top 0 * from table

返回 0 条记录,但 TQuery 被元数据“填充”。或者我认为在 TClientDataSet 上您可以将行设置为 -1,这具有相同的效果。

正如我所说,自从我在 Delphi 中进行修补已经很长时间了,我使用的是 BDE 而不是本机客户端,所以这可能都是无用的信息。

希望这会有所帮助。

【讨论】:

与 Antonio 相同,仅检索列名,不检索约束、外键、索引和其他元数据。 select top 语法不是跨不同数据库服务器的标准 SQL。使用select first 的Firebird 服务器和mysql 可以使用limit 关键字。

以上是关于Delphi:如何将表结构转换为对象的主要内容,如果未能解决你的问题,请参考以下文章

如何仅将表结构从 csv 文件导入 Access

将表转换为像字典一样的 json 对象 SQL?

黄瓜4.7.2将表转换为行到对象

将表转换为自定义类型数组

将表转换为数据框,第一列作为变量 - R [重复]

将表转换为数组