Foxpro: Проверьте, существует ли таблица через vfpoledb
Я получаю доступ к данным в файлах.dbf через System.Data.OleDb
(Vfpoledb.dll). Как я могу узнать, существует ли таблица с помощью команды SQL? Что-то похожее на следующее на сервере SQL:
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;
}
Кроме того, если вы подключаетесь к таблицам DBF, которые являются "БЕСПЛАТНЫМИ" таблицами и на самом деле НЕ являются частью подключенной "базы данных" (.dbc), то вы можете просто проверить существование файла или нет... Как в C# через
if( File.Exists( PathToTheDatabaseDirectory + TableYouExpect + ".DBF" ))
file is there
else
file is missing
Я не знаю, как сделать это только с помощью SQL, но, возможно, вы могли бы проверить наличие файла на диске с помощью метода File.Exists или написать код для проверки существования 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;
}
Я не пробовал компилировать этот код, поэтому, возможно, его нужно немного подправить.