2010年08月31日 dbi-0.4.3.gem and sqlite3-ruby-1.2.5 works right, but sqlite3-ruby-1.3.1 dosen't [長年日記]
_ dbi-0.4.3.gem and sqlite3-ruby-1.2.5 works right, but sqlite3-ruby-1.3.1 dosen't
# gem install sqlite3-ruby-1.2.5.gem # gem install dbi-0.4.3.gem # gem install dbd-sqlite3-1.2.5.gem # gem list *** LOCAL GEMS *** dbd-sqlite3 (1.2.5) dbi (0.4.3) sqlite3-ruby (1.2.5)
な環境だと
sql = <<SQL insert into member (id, name, job) values (?, ?, ?) SQL sth = dbh.prepare(sql) sth.execute(1, '伊藤 太郎', 'サラリーマン') sth.execute(2, '山田 太郎', '野球選手') sth.finish
が問題なく実行できるが
# gem install sqlite3-ruby-1.3.1.gem # gem install dbi-0.4.3.gem # gem install dbd-sqlite3-1.2.5.gem # gem list *** LOCAL GEMS *** dbd-sqlite3 (1.2.5) dbi (0.4.3) sqlite3-ruby (1.3.1)
な環境だと2発目の
sth.execute(2, '山田 太郎', '野球選手')
で以下のような
/usr/local/lib/ruby/gems/1.8/gems/sqlite3-ruby-1.3.1/lib/sqlite3/statement.rb:41:in `bind_param': library routine called out of sequence (SQLite3::MisuseException) from /usr/local/lib/ruby/gems/1.8/gems/sqlite3-ruby-1.3.1/lib/sqlite3/statement.rb:41:in `bind_params' from /usr/local/lib/ruby/gems/1.8/gems/sqlite3-ruby-1.3.1/lib/sqlite3/statement.rb:37:in `each' from /usr/local/lib/ruby/gems/1.8/gems/sqlite3-ruby-1.3.1/lib/sqlite3/statement.rb:37:in `bind_params' from /usr/local/lib/ruby/gems/1.8/gems/dbd-sqlite3-1.2.5/lib/dbd/sqlite3/statement.rb:71:in `bind_params' from /usr/local/lib/ruby/site_ruby/1.8/dbi/handles/statement.rb:115:in `execute' from ./test2.rb:86 from /usr/local/lib/ruby/site_ruby/1.8/dbi/handles/database.rb:209:in `transaction' from ./test2.rb:76
例外が発生する。
コーディングを以下のように
sql = <<SQL insert into member (id, name, job) values (?, ?, ?) SQL sth = dbh.prepare(sql) sth.execute(1, '伊藤 太郎', 'サラリーマン') sth.finish sth = dbh.prepare(sql) sth.execute(2, '山田 太郎', '野球選手') sth.finish
executeするたびにステートメントハンドルの廃棄/生成を行えば問題無く動くようだが、 dbi-0.4.3.gemはまだsqlite3-ruby-1.3.1に対応していないという事なのだろう。