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 件程度のすべてのレコードをデータ リーダーにドラッグしたためであることがわかりました。しかし、ビジュアル・フォックス・プロは、レコードのリターンを制限するという点でかなりばかげています。

理想的には、戻り値を 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 に答える