2013-05-20 52 views
0

我是Ruby的新手,所以如果這是一個愚蠢的問題,請提前原諒我。我已經搜索了答案,但沒有相關出現,似乎答案應該是顯而易見的。無法將DBI :: DatabaseHandle對象作爲參數傳遞給ruby gem方法

我試圖傳遞一個DBI :: DatabaseHandle作爲函數參數,當我運行該函數時出現錯誤的「參數個數」錯誤。這裏是我的代碼...

require 'rubygems' 
require 'dbi' 

class CmsTest 

    def self.get_dbi_connection(hostname, user, password) 
     connection = DBI.connect("DBI:OCI8:" + hostname, user, password) 
     return connection 
    end 

    def self.query(connection, sql) 
     puts connection 
     puts sql 
     begin 
      request = connection.prepare("#{query}") 
      request.execute 
      fetched = [] 
      request.fetch do |row| 
       fetched << row.to_h 
      end 
      request.finish 
      return fetched 
     rescue DBI::DatabaseError => e 
      log "An error occurred" 
      log "Error code: #{e.err}" 
      log "Error message: #{e.errstr}" 
     ensure 
     end 
    end 
end 

所以我的代碼調用,這看起來是這樣的...

require 'rubygems' 
require 'cms_test' 

connection = CmsTest.get_dbi_connection('foo', 'bar', 'fubar') 
CmsTest.query(connection, "<some sql query>") 

所以第一個參數是一個DBI :: DatabaseHandle對象,第二個是一些SQL查詢串。當我運行我得到這個...

`query': wrong number of arguments (0 for 2) (ArgumentError) 

這即使查詢簽名包含兩個參數,和我傳遞的方法兩個參數。對我來說,真的很奇怪的是,如果我在方法體中放和退出聲明的任何地方提出後它將表明,該方法確實收到2個參數...

#<DBI::DatabaseHandle:0x007fa2a316c9f0> 
select licensor_id, licensor_name from cf_licensor 

我可以」沒有任何意義。請幫忙。

+0

你可以加t他完整的堆棧跟蹤? – Puhlze

回答

0

你有一個方法叫query

def self.query(connection, sql) 

,然後裏面query您嘗試調用query

request = connection.prepare("#{query}") 
# -- method call ---------------^^^^^ 

你可能想使用sql那裏,沒有必要爲字符串插值:

request = connection.prepare(sql) 
相關問題