2012年1月17日火曜日

.NET で dBASE (古っ!) テーブルの操作

MySQL を語ったので、ついでに懐かしい dBASE も。

DataReader 等の使い方はあちこちにチラホラしてるので割愛する。

て言うか、dBASE なんて今の人は知ってるんだろうか?
そもそも有名なバージョン IV は1988年つまり、Windows 以前に発売されていたとんでもない代物なのだ!
しかもバグが多く、なぜ Borland が買ったのかよく判らないが、Borland が買ったおかげで、BDE (ボーランド・データベース・エンジン) が生まれた。
その BDE を昔は本まで購入して使ってたなぁ...

C++Builder 3/4 の頃には、BDE 関数群の直接の使用は推奨されなくなっていた。(通常は VCL を通して使う。TDateSet や TTable で。)
もちろん私だけでなく、世界中にこの BDE 関数を直接使用していた人も数多く存在していただろうし、その後も当分の間は使っていた。何故かは後述。

dBASE の良さは、
小規模なスタンドアロン使用ではおそらく今でも最上のデータベースであること。
システムの復旧がし易いという理由で、テキストを好む SE にはうってつけのツールだ。
つまり、社内データベースとしては、比較的経験が浅い SE でも充分扱えるもので、同時に勉強にもなる。MySQL や SQL Server、Oracle など、そもそもバックアップってどうやるの?会社と家の両方で常に同じ状態にしたいけどどうやるの?などなど、dBASE なら簡単明瞭!何せ dBASE はテーブルがファイル単位だから、ファイルやディレクトリ単位でコピーすれば済む。それに、フォーマットが公開されているので、自分でテキストから dBASE テーブルに変換できれば、膨大な資産をテキストでバックアップしてあるような場合でも、あまり深く考えずにデータベース化できると思う。
そして実はこれが最大の利点なのだが、大昔のデータベースであるにもかかわらず、検索スピードは異常な程速いこと。
まぁ今でこそ、データベースを語る上でセキュリティは離せなくなったが、昔はデータベースといえばまずは検索スピードだった。いや、それだけだった。
だからこそ、MySQL はここまでもてはやされるのだ。MySQL の最大の売りはその速さにあるのだから。トランザクションな InnoDB の登場以前からデフォルト・ストレージエンジンとして MyISAM があることがそれを証明している。

BDE 関数を直接使用すると、この速さを享受できる。だからプログラマは皆これを使った。もちろん推奨されなくなったことでも分かるように、この関数群が一筋縄ではいかない(笑)
まぁそれが楽しかったとも言えるが、ホントに苦労するんです、dBASE は。
昔の(15年ほど?)、何とかシステム、何たら情報システムの数パーセントは dBASE を使ってるんじゃないだろうかと思わせるほど有名だったが、大量のデータに対応できない構造になっているので(フィールドの構造にもよるが、10万件を超えるとヒーヒー言うようになり、100万件を超えると今の CPU とメモリでも結構きつくなる)、あっという間に廃れていった感じ?

BDE 関数の直接使用は興味がある人はメールください。教えます(笑)。

しかし、日曜プログラミング的な感じで、「なんちゃってシステム」みたいなものを作るとき、殆どの素人に毛が生えた程度のプログラマなら、ACCESS なんかで作ったりしてたよね?(今、書いただけで鳥肌が立った)
でも、dBASE の方が断然速いし、「なんちゃってシステム」はそんなにセキュアじゃなくて良いでしょ?

何はともあれ、こんな感じで。

using System.Data.OleDb;

namespace やら class やら
{
    string conStr =
        "Provider=Microsoft.Jet.OLEDB.4.0;" +    // お約束
        "Data Source=C:\\dBASE_Test;" +          // テーブルがあるフォルダ
        "Extended Properties=dBase IV;";            // dBase IV しか知らない (III はダメ)

    OleDbConnection dBaseCon = new OleDbConnection(conStr);
    OleDbCommand sql = dBaseCon.CreateCommand();
    OleDbDataAdapter adapter = new OleDbDataAdapter(sql);
    OleDbCommandBuilder = new OleDbCommandBuilder(adapter);

    // DataTable を使う場合
    DataTable dt = new DataTable();
    sql.CommandText = "select * from table_name.dbf";
    adapter.Fill(dt);
    // dt を使って Grid 表示したり、あれやこれや...

    dBaseCon.Open();

    // 編集も上記のように SQL 文を発行する (DataTable の機能は使わない)
    // これを身につける
    sql.CommandText = "insert into table_name.dbf values (" +
        "\"" + field1_value + "\", " +    // フィールド値が文字列の場合は「"」で囲む

        "\"" + field2_value + "\", " +
        "\"" + field3_value + "\")";

    sql.ExecuteNonQuery();

    dBaseCon.Close();
}

結局、他のテーブル操作と何ら変わることはない。
ただ若干 dBASE 仕様が所々出ているが、それだけだ。
ちなみに、DataTable は、テーブルのレコードを読み込んで、データを表示したりするのには便利だが、書き込みはイマイチ信用できない(あくまで個人的な意見だが)。
なので、
DataTable でグリッドにレコードを表示して、ユーザに編集させるような場合、Update の段階で、DataTable の各レコードのステータスを確認して、SQL 文を生成するようにした方が、面倒だが確実にテーブルを編集できる。

以前、MySQL の所でも言ったが、SQL 文のベタ書きが一番良い。プログラムで自動生成するようにするのがベスト。Builder の VCL や、.NET の DataTable のようなものは便利だが、他に移植するのが辛くなり、結局移植どころか移行もできないといった状況になる。特に上記のような編集作業は必ず SQL 文で行うようにすれば、移植が大変楽になる。
「オレは移植なんかしないよ!一生このままさ!ざまぁみやがれ!」
と言いたくなるのは、まだまだ毛がフサフサなヒヨコだ。
今の時代は、開発プラットフォームが乱立する、まさに混沌とした時代だ。
こんな状況で、未だに「VB なら出来ます」「Java を勉強して1年経ちました」などと平然と答えている若きプログラマを見ると、”何とフサフサな” と思ってしまう。
VB なら VB.NET だし、VB6 までとはまるで別物だし、.NET 繋がりで C# にもスムーズとはいかないまでも、勉強する価値はあるし、チャンスだと思う。
また、最近は Android の影響でまた「Java」ブームが再燃しているが、私も Java を勉強したので良いところは分かっているつもりだが、それでも Java は遅い、ということを認識しなくてはならない、何でもいいから取り敢えず Java で開発だ、と言うのは愚の骨頂だ。
ちなみに、Java はオブジェクト指向型だが、「オブジェクト指向」が目的となってしまっている。「オブジェクト指向」はあくまでもプログラミングの手段に過ぎない。これを言い出すと長くなるのでやめます。あっ、どこかのサイトに Java と C# を比較してたな、あのサイトは面白かった。また確認できたら載せます。