Проверьте, существует ли таблица в c # - PullRequest
5 голосов
/ 11 июня 2010

Я хочу прочитать данные из таблицы, имя которой предоставлено пользователем.Поэтому, прежде чем начать читать данные, я хочу проверить, существует база данных или нет.

Я видел несколько фрагментов кода в сети, которые утверждают, что делают это.Однако все они, похоже, работают только для SQL-сервера, или для mysql, или для какой-либо другой реализации.Нет ли общего способа сделать это?

(я уже отдельно проверяю, могу ли я подключиться к поставляемой базе данных, поэтому я вполне уверен, что соединение с базой данных может быть открыто).

Ответы [ 4 ]

3 голосов
/ 11 июня 2010

Вы можете использовать семейство методов DbConnection.GetSchema для получения метаданных о базе данных. Он вернет DataTable с объектами схемы. Точные типы объектов и значения ограничений могут различаться в зависимости от поставщика, но я уверен, что вы можете настроить проверку для конкретной таблицы таким образом, чтобы это работало в большинстве баз данных.

Вот пример использования GetSchema, который будет печатать имя и владельца каждой таблицы, которой принадлежит «имя схемы» и которая называется «имя таблицы». Это проверено против оракула. ​​

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();
        }
    }
}
3 голосов
/ 11 июня 2010

Вы не можете сделать это кросс-базой данных. Обычно DDL (то есть код для создания таблиц, индексов и т. Д.) Полностью отличается от базы данных к базе данных, поэтому логика проверки наличия таблиц также различна.

Я бы сказал, что самым простым ответом будет просто что-то вроде:

SELECT * FROM <table> WHERE 1 = 0

Если этот запрос выдает ошибку, то таблица не существует. Если это работает (хотя и вернет 0 строк), тогда таблица существует.

Будьте очень осторожны с тем, что вы разрешаете вводить пользователем. Что мешает ему указать "sysusers" в качестве имени таблицы (в SQL Server это будет список всех пользователей базы данных)

0 голосов
/ 14 марта 2016

Вы можете сделать что-то вроде этого:

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!");
                }
0 голосов
/ 11 июня 2010

Это все равно что спросить «есть ли общий способ получения связанных данных» в базах данных. Ответ, конечно же, нет - единственный «общий способ» - это иметь слой данных, который скрывает детали реализации вашего конкретного источника данных и запрашивает его соответствующим образом.

Если вы действительно поддерживаете и получаете доступ к множеству различных типов баз данных без Государственного шаблона проектирования или подобного подхода, я был бы весьма удивлен.

При этом, лучший подход - это что-то вроде этого кода:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...