2

Visual Fox Pro ODBC 驱动程序(和 OLE DB)出现问题,我用来动态获取 DBF 表的所有列名的代码适用于小型数据集。但是,如果我尝试使用下面的代码获取大型表的表架构,那么获取架构可能需要 60 秒。

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

现在我知道这是由于 Select 命令将所有 500,000 条左右的记录拖到数据读取器中,然后它才能提取列名。但是visual fox pro在限制创纪录回报方面相当垃圾。

理想情况下,我希望将返回限制为仅 1 条记录,但假设我不知道任何列名来使用 WHERE 子句,这是行不通的。

VFP 可以使用 TOP SQL 命令,但要做到这一点,您需要一个 ORDER BY 来使用它,而且由于我没有任何列名可以使用,所以这也不起作用。

因此,试图想出一种巧妙的方法来动态获取表模式而不会降低 VFP 的速度,这让我有点难过。

我认为动态数据库转换不会更快。任何人都有任何聪明的想法(除了更改数据库系统,它在工作中被继承,我目前必须使用它:))?

4

1 回答 1

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

这将带回零记录,但会填充架构。现在您有了架构,您可以进一步构建过滤器。

于 2012-10-16T11:25:00.010 回答