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:如何将表结构转换为对象的主要内容,如果未能解决你的问题,请参考以下文章