【问题标题】:Speed problems in getting Schema dynamically from a visual foxpro Datasource从可视化 foxpro 数据源动态获取 Schema 的速度问题
【发布时间】:2012-10-16 11:22:30
【问题描述】:

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 的速度,这让我有点难过。

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

【问题讨论】:

    标签: c# sql odbc oledb visual-foxpro


    【解决方案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); 
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-02
      • 2012-09-19
      • 1970-01-01
      • 2012-09-27
      • 2012-01-11
      • 2011-11-15
      • 2020-08-03
      • 1970-01-01
      相关资源
      最近更新 更多