我正在使用2.0框架,我正在寻找一种通用的方法来确定列是否存在于表中 . 我想将此代码用于多种数据库类型和提供程序 .
GetSchema方法将返回架构信息,但信息的格式和限制返回信息的数据似乎都是特定于提供程序的 .
我见过的其他解决方案似乎归结为Select * from table,然后搜索结果以查看列是否存在 . 这将起作用,但是为整个表发出一个select以查看列是否存在似乎很疯狂 .
我能想到的两个选择:
使用作为sql标准一部分的INFORMATION_SCHEMA视图会很好,但并非所有数据库系统都实现它们 . 但是,如果您关心的数据库集实现了它,那么这是您的最佳选择 .
另一种选择是接受您的查询,但在其上添加“WHERE 1 = 0”子句,以便它不返回任何行 . 在这种情况下,ADO.NET仍将返回架构
编辑:实际上,第二种方法将为您提供列及其数据类型的存在 . 但是,我不确定您是否会获得完整的架构信息,如最大长度,NULLable等.INFORMATION_SCHEMA视图确实是最好的选择,但ORACLE并未实现它们 .
我碰到过这个:
http://database-geek.com/2009/04/30/oracle-information_schema/
这是一个在Oracle中模拟INFORMATION_SCHEMA视图的开源工作 . 我不知道此时此工作的完整性或功能性 .
您可以执行以下操作,而不是从表格中选择*:
select * from table where true=false
这将让ADO在不返回任何数据的情况下查看列的名称 . 在数据库提供程序中查询系统表可能有更好的更通用的方法,但我不知道 .
2 回答
我能想到的两个选择:
使用作为sql标准一部分的INFORMATION_SCHEMA视图会很好,但并非所有数据库系统都实现它们 . 但是,如果您关心的数据库集实现了它,那么这是您的最佳选择 .
另一种选择是接受您的查询,但在其上添加“WHERE 1 = 0”子句,以便它不返回任何行 . 在这种情况下,ADO.NET仍将返回架构
编辑:实际上,第二种方法将为您提供列及其数据类型的存在 . 但是,我不确定您是否会获得完整的架构信息,如最大长度,NULLable等.INFORMATION_SCHEMA视图确实是最好的选择,但ORACLE并未实现它们 .
我碰到过这个:
http://database-geek.com/2009/04/30/oracle-information_schema/
这是一个在Oracle中模拟INFORMATION_SCHEMA视图的开源工作 . 我不知道此时此工作的完整性或功能性 .
您可以执行以下操作,而不是从表格中选择*:
这将让ADO在不返回任何数据的情况下查看列的名称 . 在数据库提供程序中查询系统表可能有更好的更通用的方法,但我不知道 .