2017-02-02 7 views
2

Может ли кто-нибудь сказать мне, как получить список таблиц в базе данных Visual FoxPro из C#?Получить список таблиц из базы данных

Я пробовал использовать GetSchema, но информация, которая возвращается, кажется, просто счет (и неточно рассчитывает на это).

Вот что у меня есть ...

string connSrc = @"Provider=VFPOLEDB.1;Data Source=myvfpdb.dbc"; 
using (var cmdSrc = new OleDbCommand()) 
using (var dbconnSrc = new OleDbConnection(connSrc)) 
{ 
    dbconnSrc.Open(); 
    DataTable schema = dbconnSrc.GetSchema(); 
} 

Я думал, что может быть какой-то способ, которым я мог бы открыть файл DBC непосредственно и запустить ВЫБРАТЬ против него, но проблема в том, что база данных находится в пути к строке подключения. Я не мог найти команду OleDb, которая извлекала бы информацию о схеме.

EDIT:

я нашел способ, который работает, но это кажется немного неуклюжим. Кто-нибудь знает лучший способ?

string connSrc = @"Provider=VFPOLEDB.1;Data Source=myvfpdb.dbc"; 
using (var conn = new OleDbConnection(connSrc)) 
    dbc = conn.DataSource; 

string path = Path.GetDirectoryName(dbc); 
string database = Path.GetFileName(dbc); 

using (var conn = new OleDbConnection(@"Provider=VFPOLEDB.1;Data Source=" + path)) 
{ 
    conn.Open(); 
    using (var cmd = conn.CreateCommand()) 
    { 
     cmd.CommandText = "SELECT * FROM " + database; 
     DbDataReader reader = cmd.ExecuteReader(); 

    } 
} 

EDIT:

С предложением Тамар изменил оператор запроса к этому ...

cmd.CommandText = $"SELECT ObjectName FROM {database} WHERE ObjectType = \"Table\""; 
+1

Можно, конечно, добавить ИНЕКЕ в запросе: WHERE ObjectType = "Таблица" –

+0

@ TamarE.Granor Хороший улов! Я добавлю это. –

+0

И? Это решило вашу проблему? Если это так, просто опубликуйте его как ответ. –

ответ

3

Я думаю, с помощью OleDbConnection.GetSchema() является путь. Как вы это делаете, он просто возвращает вам информацию о доступных метаданных. Вам нужно выбрать, какие метаданные вы хотите. Информация, которую вы видите, является количеством «доступных ограничений» и «количества частей идентификатора». Чтобы увидеть только список таблиц (с дополнительной информацией, такой как Table_type -view или таблицы, описания, даты изменения и создания), вам нужно передать «Таблицы» в качестве параметра в GetSchema. т.е .:

void Main() 
{ 
    string strCon = 
      @"Provider=vfpoledb;Data Source=C:\PROGRAM FILES (x86)\MICROSOFT VISUAL FOXPRO 9\SAMPLES\data\testdata.dbc"; 
    DataTable tableInfo; 
    using (OleDbConnection con = new OleDbConnection(strCon)) 
    { 
     con.Open(); 
     tableInfo = con.GetSchema("Tables"); 

     // or get TABLES only 
     // tableInfo = con.GetSchema("Tables", new string[] {null,null,null,"TABLE"}); 

     con.Close(); 
    } 
    foreach (DataRow row in tableInfo.Rows) 
    { 
     Console.WriteLine(@"Name:[{0}] Type:[{1}]", 
      row["TABLE_NAME"], 
      row["TABLE_TYPE"]); 
    } 
} 
+0

Awesome ... Я не знаю, как я пропустил, что 'GetSchema' может иметь параметр. Ваш код возвращает те же результаты, что и мой код, и это - ** правый ** способ сделать это. Благодарю. –