2017-02-02 93 views
2

任何人都可以告訴我如何從C#中獲取Visual FoxPro數據庫中的表的列表?從數據庫獲取表的列表

我試過使用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文件並對其運行一個SELECT但問題是數據庫所在的路徑到連接字符串。我找不到可以提取架構信息的OleDb命令。

編輯

我發現,工作的方式,但它似乎有點笨重。任何人都知道更好的方法?

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(); 

    } 
} 

編輯:

隨着添馬艦的建議改變了查詢語句這個...

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

可以肯定WHERE子句添加到查詢:WHERE OBJECTTYPE = 「表」 –

+0

@ TamarE.Granor良好的漁獲!我會補充一點。 –

+0

而且?這是否解決了你的問題?如果確實如此,請將其作爲答案發布。 –

回答

3

我認爲使用OleDbConnection.GetSchema()是要走的路。你這樣做,它只是返回你可用的元數據信息。你需要選擇你想要的元數據。您看到的信息是「可用限制」和「標識符部分數量」的計數。要僅查看錶的列表(以及其他信息,如Table_type - 查看或表格,描述,修改和創建日期),您需要將'Tables'作爲參數傳遞給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

太棒了......我不知道我錯過了什麼'GetSchema'可以傳遞一個參數。你的代碼返回與我的代碼完全相同的結果,這是**正確**的方式來做到這一點。謝謝。 –