• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
第7回セントラルソフトRuby研究会
 

第7回セントラルソフトRuby研究会

on

  • 2,247 views

 

Statistics

Views

Total Views
2,247
Views on SlideShare
2,247
Embed Views
0

Actions

Likes
0
Downloads
2
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    第7回セントラルソフトRuby研究会 第7回セントラルソフトRuby研究会 Presentation Transcript

    • Ruby研究会 (第7回)システム1部 システム開発課 山本 泰伸
    • ★本日の内容 データベースへのアクセス方法について ~理由~ ACCESSの学習をしていて、「ACCESSってRubyからアプローチできるの?」 と思ったから。 ※注意:Railsは知らないとします。
    • <目次>1.RubyからMySQL DBへのアクセス・MySQLについて・ruby/MySQLの使用2.ACCESS・ACCESSについて3.VBAとRubyからACCESS DBへのアクセス・ADOについて・Win32OLEについて
    • 1. MySQLDBへのRubyからのアクセス DB ※MySQLで作成 Ruby プログラム
    • [MySQL] 無償で入手できる扱いやすい軽快なRDBMS PostgreSQLと並ぶオープンソースRDBMSの代表格。 最大の特徴は検索の高速性に重点を絞った設計になっている点。 UNIX系各種OSやWindowsなど 多くのプラットフォームに対応している。
    • [RubyでMySQLを扱う方法] ruby/MySQLというライブラリ(mysql.rb)を導入して使用する。 (MySQL/rubyもあるが、今回は取り扱わない) (使用方法) 1.mySQLライブラリを取り込む(require„mysql‟) 2.mySQLクラスのインスタンスを生成する。 引数はサーバー名,ユーザー名,パスワード,(DB名),・・・ 3.[作成されたインスタンス].query (“引数”)で使用する。 (ex.) use DB名 → 使用するDB名を指定 SQL文 → SQL文を実行して結果を得る
    • [DBデータ]
    • [サンプルソース] DB:sampledb040/TBL:t01prefecturerequire mysqldb = Mysql.new("localhost", "root", "central")db.query("set character set sjis") ← 文字コードをShift-JISに指定db.query("use sampledb040") ← 使用するDB名を指定res = db.query("select * from t01prefecture")res.each do |row| ← 返却値resは2次元配列 puts row.join("t")enddb.close ← 使用後は閉じます。
    • [出力結果]
    • 2.ACCESS[ACCESS] Microsoft社のデータベースソフト。 独自のデータベースエンジンである「Jet Database Engine」 を搭載し、単体で完結したデータベースソフトとして 利用できるほか、Microsoft SQL ServerやODBC対応の 他社データベースエンジンなどと接続して、 テーブル表示やレコード編集などを行う。 GUIフロントエンドとして利用されることもある。 テーブルの作成や編集だけでなく、クエリの生成や入力フォーム、 レポートなど一通りの機能を備え、データベースを活用したアプリ ケーションを構築することができる。マクロやVBAでプログラムを 開発することで複雑な処理を実装することもできる。
    • [使用例] <テーブル><フォーム> <レポート>
    • 3. VBAとRubyからACCESSDBへのアクセス DB ※ACCESSで作成 VBA・Ruby プログラム
    • ACCESSDBにプログラムでアクセスする為には ADOについて知っておく必要がある。[ADO] Microsoft社が提供するデータベースアクセスの ためのソフトウェア部品。OLE DBをActiveXコントロールの形 で使えるようにしたプログラミングインターフェース。 これを使うと、Visual Basic・VBScript・C言語/C++言語 などから、共通の方法で簡単にデータベースに アクセスできるようになる。(もちろんRubyも) 実装ではConnectionオブジェクトと Recordsetオブジェクトを使用する。
    • [Connectionオブジェクト]外部DBへの接続情報を表す非持続的なオブジェクトOpenメソッドでDBをopenできる。必要情報:プロバイダ,データ名(ACCESSDBの場合)プロバイダ:ACCESS2003(.mdb):Microsoft.Jet.OLEDB.4.0 ACCESS2007(.accdb):Microsoft.ACE.OLEDB.12.0[Recordsetオブジェクト](クエリーの実行によって返された)レコードを表すオブジェクトODBC接続Connection クラスのオブジェクトにおいて、タイプ未指定でRecordsetクラスオブジェクトを作成した 場合には、順方向で読み取り専用のRecordsetクラスオブジェクトとなる。
    • ☆プログラムでの使用例☆A.ACCESSVBAを使用B.Rubyを使用
    • [DBデータ]
    • A.ACCESSVBAを使用[サンプルソース]Sub sample() Dim cn As New ADODB.Connection ← Connectionクラスのインスタンスを作成 Dim rs As New ADODB.Recordset ← Recordsetクラスのインスタンスを作成 cn.ConnectionString = "provider=Microsoft.ACE.OLEDB.12.0; ← アクセスDBの設定 Data source=D:workRubyrubysample.accdb" cn.Open ← データベースのOpen Set rs = cn.Execute("SELECT * FROM 都道府県テーブル") ← SQLを発行し、 Recordsetオブジェクトを設定 Do Until rs.EOF カーソルは1レコード目 Debug.Print rs!ID & " " & rs!都道府県 rs.MoveNext ← カーソルを次のレコードに Loop cn.Close ← 使用したら閉じます。End Sub
    • 2.Rubyを使用 サンプル提示の前に今回使用する [WIN32OLE]の説明を行う。
    • [WIN32OLE] WindowsのOLE/COM/ActiveXなどの仕組みを Ruby で扱えるようにする拡張ライブラリ Ruby1.8より初期パッケージに格納されている。 (使用方法) 1.WIN32OLEライブラリを取り込む(require „win32ole‟) 2.WIN32OLEオブジェクトのインスタンスを作成する。 この時、引数は使用したい機能を指定する。 ~引数(ProgID)の一例~ Internet Explore → InternetExplorer.Application Excel → Excel.Application Scripting Host → Wscript.Shell
    • [WIN32OLE使用例] 機能:IEを開きgoogleへアクセスし、rubyの検索結果を表示する require „win32ole‟ ie =WIN32OLE.new(InternetExplorer.Application‟) ← WIN32OLEオブジェクトの作成 機能:IEアプリケーション ie.Navigate("http://www.google.co.jp/") の操作 ie.Visible = true ← アクセス結果を見える形にする。 while ie.busy sleep 1 ← アクセスできるまで待つ(1ミリ秒待つ処理の繰り返し) End q = ie.document.all.Item("q") ← 「q」とラべリングされた項目にrubyとセット q.Value = "ruby" Google上では[入力ボックス] btnK = ie.document.all.Item("btnK") ← 「btnK」とラべリングされた項目を押下 btnK.click() Google上では[検索ボタン]
    • [サンプルソース]DB:rubysample.mdb/TBL:都道府県テーブルrequire win32ole ← WIN32OLE(Connection機能)cn = WIN32OLE.new("ADODB.Connection") オブジェクト作成rs = WIN32OLE.new("ADODB.Recordset") ← WIN32OLE(Recordset機能) オブジェクト作成cn.ConnectionString = "provider=Microsoft.ACE.OLEDB.12.0;Data source=D:workRubyrubysample.accdb" ← アクセスDBの設定cn.Open ← データベースのOpenrs = cn.Execute("SELECT * FROM 都道府県テーブル;") ← SQLを発行し、 Recordsetで取得する値を設定while !rs.EOF カーソルは1レコード目 print rs.Fields.Item(ID).Value.to_s,"t" print rs.Fields.Item(都道府県).Value,"n" rs.MoveNext ← カーソルを次のレコードにendcn.Close ← 使用したら閉じます。
    • (余談)[要素の書き出し] (MySQL(ruby/mysql))res.each do |row| puts row.join(“t“)end (ACCESS(Win32OLE))while !rs.EOF print rs.Fields.Item(ID).Value.to_s,"t“ 複雑な記述 print rs.Fields.Item(都道府県).Value,"n“ ↓ 上記ロジックのように rs.MoveNext 一括で出力したい。end
    • [理想?]while !rs.EOF print rs.Fields.Item(ID).Value.to_s,"t“ print rs.Fields.Item(都道府県).Value,"n“ rs.MoveNextend res.each do |row| puts row.join(“t“) Endrs.each_record do |rst| puts rs.join("t")End
    • RecordSet機能を持つインスタンスへ以下の機能を追加(Extend)する。module FukenRecordset def each_record ← each_recordのメソッドを定義 if self.EOF or self.BOF ← レコード位置のカーソルが 最初のレコードより前か、 return 最後のレコードより後なら終わり end until self.EOF or self.BOF fields = ["ID","都道府県"] ← 配列の各要素に対し、 values = fields.map do |field| 以下の処理を行い、配列に入れる。 self.Fields.Item(field).Value end yield values ← 値を返却して、親の処理を実行 self.MoveNext ← 次のレコードを指す end endend
    • Extendして実装する。 rs = cn.Execute("SELECT * FROM 都道府県テーブル;") rs.extend FukenRecordset (each_recordの機能) rs.each_record do |rst| 「各レコードを順番に puts rs.join("t") 配列としてブロック引数に渡す」 End cn.Close