0

私は ruby​​ を初めて使用するので、これがばかげた質問である場合は事前に許してください。私は答えをグーグルで検索しましたが、関連するものは何も表示されず、答えは明らかなはずです。

関数の引数として 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 オブジェクトで、2 番目の引数は SQL クエリ文字列です。それを実行すると、これが得られます...

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

これは、クエリシグネチャに 2 つの引数が含まれており、メソッドに 2 つの引数を渡しているにもかかわらずです。私にとって本当に奇妙なことは、プットの後にメソッド本体のどこかにステートメントを置いて終了すると、メソッドが実際に2つの引数を受け取ったことを示すことです...

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

私はこれを理解することはできません。助けてください。

4

1 に答える 1

0

という名前のメソッドがありますquery:

def self.query(connection, sql)

そして、内部queryで呼び出しを試みますquery

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

sqlあなたはおそらくそこで使いたいと思うでしょうし、文字列補間の必要はありません:

request = connection.prepare(sql)
于 2013-05-21T00:29:26.467 に答える