繁体   English   中英

检查表是否存在于C#中

[英]Check if table exists in c#

我想从用户提供名称的表中读取数据。 因此,在实际开始读取数据之前,我想检查数据库是否存在。

我在NET上看到了几段声称可以做到这一点的代码。 但是,它们似乎都只适用于SQL Server,MySQL或其他实现。 有没有通用的方法可以做到这一点?

(我已经在单独检查是否可以连接到提供的数据库,因此,我相当确定可以打开与数据库的连接。)

您不能以跨数据库的方式执行此操作。 通常,DDL(即用于创建表,索引等的代码)在数据库之间完全不同,因此检查表是否存在的逻辑也不同。

我想说,最简单的答案就是:

SELECT * FROM <table> WHERE 1 = 0

如果该查询给出错误,则该表不存在。 如果工作正常(尽管它将返回0行),则该表存在。

但是,请务必小心让用户输入的内容。 是什么阻止他将“ sysusers”指定为表名(在SQL Server中,它将是所有数据库用户的列表)

您可以使用DbConnection.GetSchema系列方法检索有关数据库的元数据。 它将返回带有模式对象的DataTable。 确切的对象类型和限制值可能因供应商而异,但是我敢肯定,您可以以适用于大多数数据库的方式来设置对特定表的检查。

这是一个使用GetSchema的示例,该示例将打印“模式名称”拥有并称为“表名称”的每个表的名称和所有者。 这是针对oracle测试的。

static void Main(string[] args)
{
    string providerName = @"System.Data.OracleClient";
    string connectionString = @"...";

    DbProviderFactory factory = DbProviderFactories.GetFactory(providerName);
    using (DbConnection connection = factory.CreateConnection())
    {
        connection.ConnectionString = connectionString;
        connection.Open();
        DataTable schemaDataTable = connection.GetSchema("Tables", new string[] { "schema name", "table name" });
        foreach (DataColumn column in schemaDataTable.Columns)
        {
            Console.Write(column.ColumnName + "\t");
        }
        Console.WriteLine();
        foreach (DataRow row in schemaDataTable.Rows)
        {
            foreach (object value in row.ItemArray)
            {
                Console.Write(value.ToString() + "\t");
            }
            Console.WriteLine();
        }
    }
}

这就像在数据库中询问“是否有一种获取相关数据的通用方法”。 答案当然不是-唯一的“通用方法”是拥有一个隐藏您特定数据源的实现细节并适当查询的数据层。

如果您真的在没有Stategy设计模式或类似方法的情况下支持和访问许多不同类型的数据库,我会感到非常惊讶。

话虽如此,最好的方法是这样的代码:

bool exists;

try
{
    // ANSI SQL way.  Works in PostgreSQL, MSSQL, MySQL.  
    var cmd = new OdbcCommand(
      "select case when exists((select * from information_schema.tables where table_name = '" + tableName + "')) then 1 else 0 end");

    exists = (int)cmd.ExecuteScalar() == 1;
}
catch
{
    try
    {
        // Other RDBMS.  Graceful degradation
        exists = true;
        var cmdOthers = new OdbcCommand("select 1 from " + tableName + " where 1 = 0");
        cmdOthers.ExecuteNonQuery();
    }
    catch
    {
        exists = false;
    }
}

来源: 检查是否存在SQL表

您可以执行以下操作:

string strCheck = "SHOW TABLES LIKE \'tableName\'";
                cmd = new MySqlCommand(strCheck, connection);
                if (connection.State == ConnectionState.Closed)
                {
                    connection.Open();
                }
                cmd.Prepare();
                var reader = cmd.ExecuteReader();
                if (reader.HasRows)
                {                             
                  Console.WriteLine("Table Exist!");
                }
                else (reader.HasRows)
                {                             
                  Console.WriteLine("Table Exist!");
                }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM