yado.rb ver 1.5 について

2009/11/03

1. ver 1.0 → 1.5 の変更点

(1) Access2007ファイル *.accdb を扱えるようにしました。

 ただし、扱うためには Office2007 がパソコンにインストールされている必要があります。Access2007はなくてもかまいません。

例:

db = Yado.new "test.accdb"
sql = "create table 名簿 (氏名 varchar(30), 電話 varchar(20));"
db.query(sql)

(2) SQL命令の実行結果(主にselect命令の結果)をResultクラスで返す query_resultメソッドを設けました。

 これにより、SQL命令の実行結果をヘッダ付きで csv, txt そして xls のファイルとして書き出せるようになりました。

例:

db = Yado.new "test.mdb"
sql = "select 氏名,電話 from 名簿;"
result = db.query_result(sql)
result.print_all_values "sql01.xls"
db.close

 Resultクラスには他にもいくつかメソッドが用意されていますので、いろいろな処理が可能です。それについては後述します。

(3) xml | adtg ファイルを書き出すメソッド query_persist を設けました。

 ADOには、SQL命令の実行結果(主にselect命令の結果)をファイル化する機能があります。それを実現するのが query_persist メソッドです。

 その時の出力ファイルの形式には xml と adtg(マイクロソフト社独自のバイナリー形式)の2種類があります。

 query_persistの戻り値は、成功 :SUCCESS, 失敗 :LOSE です。

 書き出すためのサンプルは次のとおり。

例:

db = Yado.new "test.mdb"
sql = "select 氏名,電話 from 名簿;"
db.query_persist(sql, "sql01.xml")  # 拡張子を .adtg にすればその形式で出力
db.close

(4) xml | adtg ファイルを読み込むメソッド load_persist を設けました。

 上記の query_persist メソッドで書き出した xml | adtg ファイルを読み込む時は、load_persistを用います。

 このメソッドで読み込めるxmlファイルは、「どんなxmlでもOK」ということではなく、ADOを用いて書き出したxmlです。Accessを使って書き出したxmlも大丈夫だと思います。

 load_persistには次の2つの使い方があります。第2引数を指定するケースと、指定しないケースです。

(a) db.load_persist("input.xml", "new_table")

 input.xmlを読み込んだ結果を、データベース db の中の new_table というテーブルとして書き出します。新たに new_table というテーブルを作ることになります。

(b) result = db.load_persist("input.xml")

 input.xmlを読み込んだ結果を、Resultクラスとして返します。次のステップで

result.print_all_values("output.xls")

のようにすれば、その結果をExcelファイルとして書き出せます。

例その1:

db = Yado.new "test.mdb"
db.load_persist("input.adtg", "new_table")

例その2:

db = Yado.new "test.mdb"
result = db.load_persist("input.xml")
result.print_all_values("output.xls")  unless result == nil
result.free

(5) csv形式をrubyの配列に変換するメソッド csv_to_array の不具合を修正しました。

 csvの一つのセルが3行以上から成る場合、正しく処理されない時があったので修正しました。

(6) メソッド名の省略型を用意しました。


のように省略名で書けます。

2. Resultクラスについて

 query_resultメソッドによって sql命令(主にselect命令)を実行すると、Resultクラスが返されます。

 また、load_persistメソッドで xml | adtg ファイルを読み込んだ時も Resultクラスが返される場合があります。

 Resultクラスの仕様は次のとおりです。

(1) クラスのメンバー変数

 次のメンバー変数があります。

(2) クラスのメンバーメソッド

○ print_all_values(filename) または pav(filename)

 指定されたファイルに、バイナリー以外のデータを総て書き出す。

 引数の出力ファイル名の拡張子は、.csv(csv形式), .xls(Excel形式), .txt(タブ区切りテキスト)を指定可能。これ以外の拡張子の場合は総てタブ区切りテキストとして出力。

例:

sql = "select * from テーブル01 where 身長 > 170.0;"
result = db.query_result(sql)
result.print_all_values("output.csv")
result.pav("output.xls")

○ print_to_db(db, tblname)

 resultの内容をdbのテーブルtblnameに書き出す。新たなテーブル tblname を設けて、そこに書き出す。

例:

sql = "select * from テーブル01 where 身長 > 170.0;"
result = db.query_result(sql)
result.print_to_db(db, "身長170超")

○ each(fldnames) または each_record(fldnames)

 各レコードを最初から最後まで一つづつ取り出して参照する。

 参照したいフィールド名を指定可能。指定しなければ総てのフィールド。

例:

result.each {|rs|  p rs}
result.each("氏名") {|rs|  p rs}

○ each_hash

 各レコードを最初から最後まで一つづつ取り出して参照する。ハッシュ形式で参照したい時に用いる。

例:

result.each_hash {|h|  p h["氏名"]}

○ list_field_names(binary_sw)

 フィールド名群を返す。戻り値は、文字列から構成される配列。

 バイナリ項目の扱うを指定可能。 :INCLUDE(バイナリーを含む。デフォルト値), :EXCEPT(バイナリーを除く), :ONLY(バイナリーのみ)

例:

ary = result.list_field_names(:EXCEPT)
ary.each {|fldname|  p fldname}

○ fetch_field

 注目フィールドの情報(構造体Field_s)を返す。そして、注目フィールド番号に1を加算する。したがって、次にfetch_fieldを呼び出すと、次のフィールド情報を得ることになる。

○ fetch_fields

 フィールド群の情報(構造体Field_sの配列)を返す。

○ fetch_field_direct(n)

 n番目のフィールド情報(構造体Field_s)を返す。

○ field_seek(n)

 注目フィールドの番号をnに設定する。

○ field_tell

 注目フィールドの番号を返す。

○ num_fields

 フィールドの個数を返す。

○ data_seek(n)

 注目レコードの番号をnに設定。

○ row_seek(n)

 注目レコードの番号をnに設定する。data_seek(n) と同じ。

○ row_tell

 注目レコードの番号を返す。

○ fetch_lengths

 注目レコードの各フィールド値の長さ(バイト数)を配列で返す。[2, 10, 34] などのような配列が返される。

例:

sql = "select * from テーブル01 where 身長 > 170.0;"
result = db.query_result(sql)
result.data_seek(0)  # 最初のレコード(0番)に注目
p result.fetch_lengths

○ fetch_row

 注目レコードの情報(配列)を返す。そして、注目レコード番号に1を加算する。したがって、次にfetch_rowを呼び出すと、次のレコード情報を得ることになる。

例:

sql = "select * from テーブル01 where 身長 > 170.0;"
result = db.query_result(sql)
while r = result.fetch_row
    puts r.join("\t")
end

○ fetch_hash

 注目レコードの情報をハッシュで返す。そして、注目レコード番号に1を加算する。したがって、次にfetch_hashを呼び出すと、次のレコード情報を得ることになる。

例:

sql = "select * from テーブル01 where 身長 > 170.0;"
result = db.query_result(sql)
while h = result.fetch_hash
    puts h["氏名"]
end

○ num_rows

 レコードの個数を返す。

○ free

 Resultクラスの中身を全部消去して、メモリーを解放。

例:

result.free

 以上。