是否有任何通用的SQL方法来获取表名和创建表?

时间:2011-02-24 17:18:45

标签: c# sql ado

对于“表名”,我的意思是正常的名称(不是查询或类似的东西),普通的旧表。这是因为我正在处理一个当前连接到Jet引擎的项目以及其他功能,它显示了一个表列表,用户可以双击它以查看某些特定的表内容。但现在我希望用户能够从已安装的引擎列表中更改引擎。但是对于我的程序与其他引擎一起工作,它需要以适合每个SQL引擎(或至少大多数)的方式获取表名。实际上我还需要能够获取特定表的所有列名,并且还能够以适用于每个可能引擎的方式创建“CREATE TABLE”查询(因为用户可以从中创建表)向导,我的程序生成查询)。我实际上非常怀疑这是可能的,但据我所知,Visual Studio可以从向导为不同的数据库引擎创建表。他们如何设法做到这一点?我是否必须为每个可能的SQL引擎提供不同的“CREATE TABLE”查询?

我想知道ADO是否可以为此提供帮助,因为它似乎已经以某种方式标准化。

5 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:2)

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

select table_name from information_schema.tables

使用键和索引的基本create table命令很容易编码,几乎与每个后端 execpt 兼容,用于自动递增的整数键,每个后端都有不同的语法端。

所以答案,“大多数情况下是肯定的,可能比你想象的要多,但不是100%”。因为怪癖很小,所以可以编写一些通用代码,并对特定的后端进行一些调整。

答案 2 :(得分:1)

这应该在MSSQL中为您完成。我想它与其他SQL实现非常相似。

SELECT DISTINCT Name FROM sysobjects WHERE xtype='U'

答案 3 :(得分:1)

您可以使用GetSchema ADO函数获取几乎所有架构数据的DataTable

此示例使用SQLConnection,但该函数可用于任何ODBCConnection.

using System;
using System.Data;
using System.Data.SqlClient;

class Program
{
  static void Main()
  {
  string connectionString = GetConnectionString();
  sing (SqlConnection connection = new SqlConnection(connectionString))
  {
   // Connect to the database then retrieve the schema information.
   connection.Open();
   DataTable table = connection.GetSchema("Tables");

   // Display the contents of the table.
   DisplayData(table);
   Console.WriteLine("Press any key to continue.");
   Console.ReadKey();
   }
 }

  private static string GetConnectionString()
  {
   // To avoid storing the connection string in your code,
   // you can retrieve it from a configuration file.
   return "Data Source=(local);Database=AdventureWorks;" +
      "Integrated Security=true;";
  }

  private static void DisplayData(System.Data.DataTable table)
  {
     foreach (System.Data.DataRow row in table.Rows)
     {
        foreach (System.Data.DataColumn col in table.Columns)
        {
           Console.WriteLine("{0} = {1}", col.ColumnName, row[col]);
        }
     Console.WriteLine("============================");
     }
  }
}

答案 4 :(得分:1)

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