From: Masatoshi SEKI Date: 2001-06-10T04:04:10+09:00 Subject: [ruby-talk:16373] Re: [ANN] Ruby/DBI 0.0.5 Hi, > Here's a simple example showing how to insert 100 rows into a database: > > require 'dbi' > > DBI.connect('dbi:Pg:michael', 'michael', 'michael', 'AutoCommit' => false) do |dbh| > dbh.prepare("INSERT INTO test VALUES (?,?)") do |sth| > for i in 1..100 do > sth.execute(i, "Line #{i}") > end > end > end I tried Ruby/DBI 0.0.5 with Pg, But my script made a minnor truble... --------------- require 'dbi' DBI.connect("dbi:Pg:#{ARGV[0]}", ARGV[1]) do |dbh| begin dbh.do("drop table mytest") rescue DBI::ProgrammingError end dbh.do("create table mytest (a int, b text)") sth = dbh.prepare("INSERT INTO MYTEST VALUES (?, ?)") 10.times do |i| sth.execute(i.to_s, dbh.quote("Line #{i}?")) # <-- "?" contains!! end end --------------- % ruby t.rb sekitest mas /usr/local/lib/ruby/site_ruby/1.6/DBD/Pg/Pg.rb:209:in `execute': Not enough SQL parameters (DBI::ProgrammingError) from /usr/local/lib/ruby/site_ruby/1.6/dbi/dbi.rb:576:in `execute' from t.rb:15 from t.rb:14:in `times' from t.rb:14 from t.rb:3:in `connect' from /usr/local/lib/ruby/site_ruby/1.6/dbi/dbi.rb:255:in `connect' from t.rb:3 --------------- I changed the lib/dbi/sql.rb. How about it? --- sql.rb Thu May 31 22:26:59 2001 +++ /usr/local/lib/ruby/site_ruby/1.6/dbi/sql.rb Sun Jun 10 04:00:38 2001 @@ -38,16 +38,24 @@ module BasicBind def bind(quoter, sql, args) - boundsql = sql.dup - boundsql.gsub! (/\?\?/, "\001") - args.each { |arg| - if ! boundsql.sub! (/\?/, quoter.quote(arg)) - raise "Too many SQL parameters" - end - } - raise "Not enough SQL parameters" if boundsql =~ /\?/ - boundsql.gsub!(/\001/, "?") - boundsql + boundsql = sql.gsub(/\?\?/, "\001") + + ary = boundsql.split('?') + case ary.size <=> args.size + 1 + when -1 + raise "Not enough SQL parameters" if args.empty? + when 1 + raise "Too many SQL parameters" unless args.empty? + end + + boundsql = '' + args.each do |arg| + boundsql.concat(ary.shift) + boundsql.concat(arg) + end + boundsql.concat(ary.shift) + + boundsql.gsub(/\001/, "?") end