2010-08-04 2 views
2

Я получаю доступ к данным в .dbf-файлах через System.Data.OleDb (vfpoledb.dll). Как узнать, существует ли таблица через команду SQL? Нечто похожее на следующее на сервере SQL:Foxpro: Проверить, существует ли таблица через vfpoledb

IF (EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'TheTable')) 
BEGIN 
    --Do Stuff 
END 

ответ

3

Если у вас есть файл dbc, вы можете запросить его, чтобы увидеть, существует ли таблица.

string dbc = "northwind.dbc"; 

using (OleDbConnection conn = new OleDbConnection(connectionString)) { 
    DataTable dt = new DataTable(); 
    string sql = string.Format(@"SELECT * FROM {0} WHERE ALLTRIM(ObjectType) = 'Table' AND UPPER(ALLTRIM(ObjectName)) = '{1}'", dbc, tableName.ToUpper()); 
    OleDbDataAdapter da = new OleDbDataAdapter(sql, conn); 
    da.Fill(dt); 
    bool tableExists = dt != null && dt.Rows.Count == 1; 
} 

Но для получения этой информации вам не нужна команда sql или dbc-файл. Вы можете получить его прямо из OleDbConnection с помощью метода GetSchema.

using (OleDbConnection conn = new OleDbConnection(connectionString)) { 
    conn.Open(); 
    DataTable tables = conn.GetSchema("Tables"); 
    conn.Close(); 

    var tableExists = (from row in tables.AsEnumerable() 
         where row.Field<string>("Table_Name").Equals(tableName, StringComparison.CurrentCultureIgnoreCase) 
         select row.Field<string>("Table_Name")).FirstOrDefault() != null; 
} 
+0

Спасибо за подсказку о GetSchema(). –

0

Я не знаю, как сделать это только с помощью SQL, но, может быть, вы могли бы проверить существование файла на диске с помощью File.Exists Method или вы могли бы написать код для проверки существования DBF с использованием классов OleDb:

private bool DbfExists(string dbfName, string connectionString) 
{ 
    bool dbfExists = true; 

    using(OleDbConnection conn = new OleDbConnection(connectionString)) 
    { 
     string sql = string.Format("SELECT * FROM {0}", dbfName); 

     using(OleDbCommand command = new OleDbCommand(sql, conn)) 
     { 
      OleDbDataReader reader = null; 

      try 
      { 
       conn.Open(); 
       reader = command.ExecuteReader(); 
      } 
      catch(Exception ex) 
      { 
       dbfExists = false; 
      } 
      finally 
      { 
       conn.Close(); 
       reader = null; 
      } 
     } 
    } 

    return dbfExists; 
} 

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

+0

Thnaks. Теперь я делаю что-то подобное, но мне интересно, есть ли для него команда SQL. –

1

Кроме того, если вы подключаетесь к DBF таблиц, которые являются «свободными» таблицы и фактически не является частью связной «базы данных» (.dbc), то вы можете просто проверить существование файла или нет .. Например, в C# через

if(File.Exists(PathToTheDatabaseDirectory + TableYouExpect + ".DBF")) 
    file is there 
else 
    file is missing