2009/11/03
(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) メソッド名の省略型を用意しました。
query_resultメソッドによって sql命令(主にselect命令)を実行すると、Resultクラスが返されます。
また、load_persistメソッドで xml | adtg ファイルを読み込んだ時も Resultクラスが返される場合があります。
Resultクラスの仕様は次のとおりです。
次のメンバー変数があります。
指定されたファイルに、バイナリー以外のデータを総て書き出す。
引数の出力ファイル名の拡張子は、.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")
resultの内容をdbのテーブルtblnameに書き出す。新たなテーブル tblname を設けて、そこに書き出す。
例:
sql = "select * from テーブル01 where 身長 > 170.0;"
result = db.query_result(sql)
result.print_to_db(db, "身長170超")
各レコードを最初から最後まで一つづつ取り出して参照する。
参照したいフィールド名を指定可能。指定しなければ総てのフィールド。
例:
result.each {|rs| p rs}
result.each("氏名") {|rs| p rs}
各レコードを最初から最後まで一つづつ取り出して参照する。ハッシュ形式で参照したい時に用いる。
例:
result.each_hash {|h| p h["氏名"]}
フィールド名群を返す。戻り値は、文字列から構成される配列。
バイナリ項目の扱うを指定可能。 :INCLUDE(バイナリーを含む。デフォルト値), :EXCEPT(バイナリーを除く), :ONLY(バイナリーのみ)
例:
ary = result.list_field_names(:EXCEPT)
ary.each {|fldname| p fldname}
注目フィールドの情報(構造体Field_s)を返す。そして、注目フィールド番号に1を加算する。したがって、次にfetch_fieldを呼び出すと、次のフィールド情報を得ることになる。
フィールド群の情報(構造体Field_sの配列)を返す。
n番目のフィールド情報(構造体Field_s)を返す。
注目フィールドの番号をnに設定する。
注目フィールドの番号を返す。
フィールドの個数を返す。
注目レコードの番号をnに設定。
注目レコードの番号をnに設定する。data_seek(n) と同じ。
注目レコードの番号を返す。
注目レコードの各フィールド値の長さ(バイト数)を配列で返す。[2, 10, 34] などのような配列が返される。
例:
sql = "select * from テーブル01 where 身長 > 170.0;"
result = db.query_result(sql)
result.data_seek(0) # 最初のレコード(0番)に注目
p result.fetch_lengths
注目レコードの情報(配列)を返す。そして、注目レコード番号に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
注目レコードの情報をハッシュで返す。そして、注目レコード番号に1を加算する。したがって、次にfetch_hashを呼び出すと、次のレコード情報を得ることになる。
例:
sql = "select * from テーブル01 where 身長 > 170.0;"
result = db.query_result(sql)
while h = result.fetch_hash
puts h["氏名"]
end
レコードの個数を返す。
Resultクラスの中身を全部消去して、メモリーを解放。
例:
result.free
以上。