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 で速度を落とさずにテーブル スキーマを動的に取得する賢い方法を考えようとして、少し困惑しています。
その場でのデータベース変換がこれ以上速くなるとは思いません。誰もが巧妙なアイデアを持っています (データベース システムを変更することを除けば、それは仕事で継承されており、現在それを使用する必要があります:))?