2010-06-11 3 views
5

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

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

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

+0

возможный дубликат (http://stackoverflow.com/questions/464474/check-if-a -sql-table-exists) –

+0

@Graphain Кажется, это дубликат, должен ли я что-то сделать? – apoorv020

+0

Как правило, просто подождите, пока другие пользователи будут закрыты и перенаправлены, но это не проблема. –

ответ

2

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

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

SELECT * FROM <table> WHERE 1 = 0 

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

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

+1

Опираясь на ошибку, чтобы проверить наличие чего-либо, кажется, действительно плохая идея! –

+2

Наоборот, мы знаем, что этот запрос не содержит ошибок.Единственная зависимость заключается в том, что данная таблица должна существовать в контексте данного соединения. ЛЮБАЯ ошибка означала бы, что таблица не может быть доступна (или что-то настолько странное/случайное, с которым нельзя справиться), поэтому я не вижу никаких проблем приравнивании поднятого исключения с отсутствием доступа к таблице supullied. – apoorv020

+0

@Greg B: Я не согласен, я бы сказал, что это очень распространенный шаблон: как вы проверяете файл, за исключением того, что пытаетесь его открыть? Как проверить доменное имя действительно, за исключением того, что пытаетесь разрешить его на IP? Как вы проверяете адрес электронной почты, если вы пытаетесь отправить ему электронное письмо? И так далее ... –

0

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

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

Это, как говорится, лучший подход является то, как этот фрагмент кода:

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; 
    } 
} 

Источник: Check if a SQL table exists

3

Вы можете использовать семейство 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(); 
     } 
    } 
} 
+0

Когда таблица не существует, как 'OracleConnection', так и' SqlConnection', реализация 'GetSchema' вернет DataTable с нулевыми строками. Этот результат может быть неотличим от таблицы, которая существует, но не имеет столбцов. Однако таблицы без столбцов не допускаются как в Oracle, так и в SQL Server. Итак, 'bool doesTableExist = (schemaDataTable.Rows.Count == 0)' должен работать для вас. –

0

Вы можете сделать что-то вроде этого: [. Проверьте, если таблица 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!"); 
       } 
Смежные вопросы