在C#中获取DataBase表名

时间:2013-12-11 10:43:33

标签: c# sql database oledb

好吧,我知道这个案子已在网上讨论过,但我仍然不明白。

到目前为止,这是我的搜索结果:

"SELECT table_name AS Name FROM INFORMATION_SCHEMA.Tables WHERE TABLE_TYPE = 'BASE TABLE'";

在这个SQL代码中,我认为INFORMATION_SCHEMA是一个数据库名称,当我执行代码(当然使用连接的数据库名称)时,抛出了一个异常,说数据库名称不存在

更新

当我运行SQL查询并使用:

执行它时
OleDbDataReader reader = cmd.ExecuteReader();

它说:Could not find: path/INFORMATION_SCHEMA.mdb;

我已经做过的事情很好,但是:

  1. 连接字符串用数据库名称填充。
  2. 我可以在我的数据库中执行通常的SQL CommandText。
  3. 我正在使用OLEDB DBMS。
  4. 解决

    我的最终代码在其他人的帮助下是:

    DataTable MySchemaTable = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,
    new Object[] { null, null, null, "TABLE" });
    
    for (int i = 0; i < MySchemaTable.Rows.Count; i++) {
    combobox1.Items.Add(MySchemaTable.Rows[i].ItemArray[2].ToString()); }
    

    另一个搜索是:

    `DataTable T = con.GetSchema("Tables");`
    

    当我打印出t.ToString();时,它只显示表格。

    还有更多搜索。

    CASE CLOSED!

4 个答案:

答案 0 :(得分:0)

INFORMATION_SCHEMA不是数据库名称,它是每个数据库中都存在的模式。它包含为您提供有关数据库结构的信息的视图。

  

信息架构视图是SQL Server为获取元数据提供的几种方法之一。信息架构视图提供SQL Server元数据的内部系统表独立视图。尽管已对基础系统表进行了重大更改,但信息模式视图使应用程序能够正常工作。 SQL Server中包含的信息架构视图符合INFORMATION_SCHEMA的ISO标准定义。

您的查询将为您提供所有表的名称,在您的连接字符串中,您应指定要为其获取所有表的数据库名称。

有关MSDNINFORMATION_SCHEMA的更多信息。

答案 1 :(得分:0)

在开始查询之前,您是否可以尝试使用数据库? 像这样:

USE [databaseName]
GO
SELECT table_name AS Name FROM INFORMATION_SCHEMA.Tables WHERE TABLE_TYPE = 'BASE TABLE'

因此,您可以确定,在开始查询之前,您已连接到良好的数据库

答案 2 :(得分:0)

您不能在OLEDB中使用INFORMATION_SCHEMA,它有不同的方式来提供其表信息。看看GetOleDbSchemaTable。它看起来像:

MySchemaTable = MyConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, _
                   New Object() {Nothing, Nothing, Nothing, "TABLE"})

文档说明here

  

OLE DB的.NET Framework数据提供程序也公开了架构   使用GetOleDbSchemaTable方法的信息   OleDbConnection对象。作为参数,GetOleDbSchemaTable需要一个   OleDbSchemaGuid,用于标识要返回的架构信息,以及   对这些返回列的一系列限制。   GetOleDbSchemaTable返回填充了请求的DataTable   架构信息。

答案 3 :(得分:0)

不需要所有这些麻烦。您只需关注this answer

即可
  

要检查表是否存在,您可以像这样扩展DbConnection:

public static class DbConnectionExtensions
{
    public static bool TableExists(this DbConnection conn, string table)
    {
        conn.open();
        var exists = conn.GetSchema("Tables", new string[4] { null, null, table, "TABLE" }).Rows.Count > 0;
        conn.close();
        return exists;
    }
}
     

然后你可以在任何派生类中调用TableExists   OleDbConnection,SQLiteConnection或SqlConnection。