C# 有没有通用的SQL方法来获取表名和创建表?

C# 有没有通用的SQL方法来获取表名和创建表?,c#,sql,ado,C#,Sql,Ado,“表名”指的是普通的(不是查询或类似的)普通旧表的名称。这是因为我正在处理一个项目,该项目目前连接到Jet引擎,除其他功能外,它显示了一个表格列表,用户可以双击该列表以查看某些特定用户的表格内容。但是现在我希望用户能够从已安装的引擎列表中更改引擎。但要让我的程序与其他引擎协同工作,它需要以一种适用于每个SQL引擎(或至少大多数SQL引擎)的方式获取表名。实际上,我还需要能够获取特定表的所有列名,并且能够创建一个“createtable”查询,该查询将与每个可能的引擎一起工作(因为用户可以通过向导

“表名”指的是普通的(不是查询或类似的)普通旧表的名称。这是因为我正在处理一个项目,该项目目前连接到Jet引擎,除其他功能外,它显示了一个表格列表,用户可以双击该列表以查看某些特定用户的表格内容。但是现在我希望用户能够从已安装的引擎列表中更改引擎。但要让我的程序与其他引擎协同工作,它需要以一种适用于每个SQL引擎(或至少大多数SQL引擎)的方式获取表名。实际上,我还需要能够获取特定表的所有列名,并且能够创建一个“createtable”查询,该查询将与每个可能的引擎一起工作(因为用户可以通过向导创建表,并且我的程序生成查询)。事实上,我很怀疑这是否可行,但据我所知,VisualStudio可以通过向导为不同的数据库引擎创建表。他们是如何做到这一点的?我是否必须为每个可能的SQL引擎使用不同的“创建表”查询


我想知道ADO是否可以帮助解决这个问题,因为它似乎以某种方式将所有内容都标准化了

不,不幸的是,据我所知,没有通用的方法来做这些事情。所有数据库引擎都有略微不同的DDL和SQL方言,支持不同的数据类型集,以及管理元数据的不同方式等。如果您保持功能的绝对最低分母,我想您可以依赖标准SQL/DDL,但这将非常有限

通常,这可以通过创建一个抽象数据层来解决,该抽象数据层具有多个不同的实现来处理差异


ADO只解决了部分问题,因为它提供了一个向数据库发送查询的公共接口,但查询中的SQL必须由客户端指定

不,不幸的是,据我所知,没有通用的方法来做这些事情。所有数据库引擎都有略微不同的DDL和SQL方言,支持不同的数据类型集,以及管理元数据的不同方式等。如果您保持功能的绝对最低分母,我想您可以依赖标准SQL/DDL,但这将非常有限

通常,这可以通过创建一个抽象数据层来解决,该抽象数据层具有多个不同的实现来处理差异


ADO只解决了部分问题,因为它提供了一个向数据库发送查询的公共接口,但查询中的SQL必须由客户端指定

在MSSQL中,这应该可以为您做到这一点。我想对于其他SQL实现来说,情况会非常类似

SELECT DISTINCT Name FROM sysobjects WHERE xtype='U'

这应该在MSSQL中为您完成。我想对于其他SQL实现来说,情况会非常类似

SELECT DISTINCT Name FROM sysobjects WHERE xtype='U'
如果您想要任何后端,总会有一个不起作用,但几乎每个后端都允许:

select table_name from information_schema.tables
您的基本create table命令(带有键和索引)很容易编码为与几乎每个后端兼容,execpt for auto incremented integers键,每个后端都有不同的语法

所以答案是,“大部分是的,可能比你想象的要多,但不是100%”。因为怪癖很小,所以可以为特定的后端编写一些带有一些调整的通用代码。

如果您想要任何后端,总会有一个不起作用,但几乎每个后端都允许:

select table_name from information_schema.tables
您的基本create table命令(带有键和索引)很容易编码为与几乎每个后端兼容,execpt for auto incremented integers键,每个后端都有不同的语法

所以答案是,“大部分是的,可能比你想象的要多,但不是100%”。因为这些怪癖很小,所以可以为特定的后端编写一些带有一些调整的通用代码。

您可以使用ADO函数来获得几乎所有模式数据的一个完整的解决方案

本例使用SQLConnection,但该函数可以在任何情况下使用

您可以使用ADO函数获得包含几乎所有模式数据的

本例使用SQLConnection,但该函数可以在任何情况下使用


在VisualStudio中,它是使用数据设计器扩展性(DDEX)实现的,在DDEX中,特定的提供程序应该公开GetSchema方法来帮助检索元数据。您可以获得一些想法。

在Visual Studio中,它是使用数据设计器可扩展性(DDEX)实现的,在DDEX中,特定的提供者应该公开GetSchema方法来帮助检索元数据。您可以获得一些想法。

或者更好:使用SQL Server 2005中引入的
sys
目录视图,而不是弃用的
sysobjects
——您的查询将是:
从sys.tables中选择名称
或者更好:使用
sys
目录视图,在SQL Server 2005中引入,而不是不推荐的
sysobjects
——您的查询将是:
SELECT Name FROM sys.tables
,如果您所说的“几乎所有”都是指Oracle、FireBirdeyeah、,这里有人提醒我Oracle不支持这一点——我想通常是你在发表评论:)我想调整的方法是jimmy创建一些看起来相同的视图。如果你所说的“几乎所有”都是指除了Oracle、Firebirdeyeah之外,我在这里被提醒Oracle不支持这一点——我想这通常是你在做评论:)我想,调整的方法是jimmy设置一些看起来相同的视图。不幸的是,并非所有ODBC驱动程序都支持GetSchema方法。。此外,我认为这对表的创建没有帮助,因为数据类型等仍然会有所不同。jsolid:nooo,copy-pasted from-MSDN(检查链接)。不幸的是,并非所有ODBC驱动程序都支持GetSchema方法。。此外,我认为这对创建表没有帮助,因为数据类型等仍然会有所不同JSolid:nooo,从MSDN粘贴副本(检查链接)