Delphi:如何将表结构放入对象中

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

1
虽然这个问题不完全相同,但有人发布了一个答案(带有注释块和所有SQL脚本),可以检索所有表定义、数据库信息等,可能会有所帮助。 - Ken White
没有通用的方法可以这样做,因此您需要声明一个抽象基类,并从特定于DBMS的存储(例如:SQL-92兼容的DBMS上的INFORMATION_SCHEMA)中填充实际模式数据。 - OnTheFly
使用TADOConnection.OpenSchema,您将能够获取大部分信息。其他模式相关信息可以在sys表中找到(取决于您的SQL Server版本)。 - kobik
2个回答

3

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

选择*从表中,其中1=2

更新:

可以使用信息模式视图检索元数据,例如约束:

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

这只检索列名,而不是约束、外键、索引和其他元数据。 - Ken White
使用负where条件会浪费很多IO周期,因为它需要在SQL解析和执行期间评估条件。例如,一个Firebird服务器对于负的where条件耗费执行时间= 110ms。在执行期间使用select first 0 * from table,其耗费的执行时间= 0ms - Chau Chee Yang

0

距离我上次接触Delphi已经很久了,但我仍然记得一些我曾经做过的事情。比如

select top 0 * from table

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

正如我所说,很长时间以来我都没有在 Delphi 中玩过,而且我使用的是 BDE 而不是本地客户端,所以这些信息可能都是无用的。

希望这能有点帮助。


与安东尼奥相同,该代码仅检索列名称,而不包括约束、外键、索引和其他元数据。 - Ken White
“select top” 语法不是跨不同数据库服务器的标准 SQL。Firebird 服务器使用 “select first”,而 MySQL 可能使用 “limit” 关键字。 - Chau Chee Yang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接