2012-10-16 37 views
2

使用Visual Fox Pro ODBC驅動程序(和OLE DB)時出現的問題是,我用來動態獲取DBF表的所有列名的代碼適用於小數據集。但是,如果我嘗試使用下面的代碼獲取表模式來獲取大表,那麼獲取模式可能需要60秒。從Visual FoxPro動態獲取Schema的速度問題數據源

OdbcConnection conn = new OdbcConnection(@"Dsn=Boss;sourcedb=u:\32BITBOSS\DATA;sourcetype=DBF;exclusive=No;backgroundfetch=Yes;collate=Machine;null=Yes;deleted=Yes");  
OdbcCommand cmd = new OdbcCommand("Select * from " + listBox1.SelectedItem.ToString(), conn); 
conn.Open(); 
try 
{ 

    OdbcDataReader reader = cmd.ExecuteReader(); 
    DataTable dt = reader.GetSchemaTable(); 

    listBox2.Items.Clear(); 

    foreach (DataRow row in dt.Rows) 
    { 
     listBox2.Items.Add(row[0].ToString()); 
    } 

    conn.Close(); 

} 
catch (Exception ex) 
{ 
    Console.WriteLine(ex.ToString()); 
    conn.Close(); 
} 

現在我得到的,這是由於選擇命令拖動全部500000條記錄成左右的數據讀取器,然後才能然後提取的列名。但視覺狐狸親是在限制記錄回報相當垃圾。

我理想情況下想將返回限制爲只有1條記錄,但假設我不知道任何列名使用WHERE子句,這是行不通的。

VFP可以利用TOP SQL命令,但是要做到這一點,你需要一個ORDER BY來使用它,並且由於我沒有要使用的任何列名,所以這也不起作用。

所以我有點難住,試圖想出一個聰明的方式來動態獲取表架構,而不會在VFP中減速。

我不認爲動態數據庫轉換會更快。任何人有任何聰明的想法(除了改變數據庫系統,它在工作中繼承,我目前必須使用:))?

回答

1

改變這一行:

OdbcCommand cmd = new OdbcCommand("Select * from " + listBox1.SelectedItem.ToString(), conn); 

這一行:

OdbcCommand cmd = new OdbcCommand(string.Format("Select * from {0} where 1 = 0", listBox1.SelectedItem.ToString()), conn); 

這將帶回零分的記錄,但補的模式。現在您已經有了架構,您可以進一步構建過濾器。