2013-07-25 4 views
0

У меня есть следующий метод в классе ruby ​​класса dbmgr, который Im использует в цикле для вставки данных из csv в sqlite3 db:ruby ​​sqlite error 'make in insert_row': неопределенная локальная переменная или метод 'stmt'

def insert_row(aRow) 
    begin 
    @db = SQLite3::Database.open("#{@dbn}") 
    rhash = aRow.row_hash 

    stm = @db.prepare("INSERT INTO programs (programName, episodeName) VALUES (? , ?)") 
     stm.bind_param(1, '#{rhash["Program"]}') 
     stm.bind_param(2, '#{rhash["Episode Name"]}') 
     stmt.execute() 
     programId = @db.last_insert_row_id 


    rescue SQLite3::Exception => e 
     puts "Exception occured" 
     puts e.message 
     puts e.backtrace 

    ensure 
     stmt.close if stmt 
     @db.close if @db 

    end #db 

Когда я делаю что на консоли после 1-й вставки, я получаю следующее сообщение об ошибке:

`ensure in insert_row': undefined local variable or method `stmt' for #<Dbmgr:0x007f9511050188> (NameError) 

Изначально я не использовал подготовить и bind_params особенности рубина для SQLite. Однако после некоторых символов, таких как «» в тексте, я вставлял генерируемые исключения, я где-то читал, что использование bind_params очистит вход, поэтому я использовал bind_params. Но теперь я получаю эту ошибку.

Может кто-то помочь, пожалуйста?

Благодаря

ответ

0
stm = @db.prepare("INSERT INTO programs (programName, episodeName) VALUES (? , ?)") 
    stm.bind_param(1, '#{rhash["Program"]}') 
    stm.bind_param(2, '#{rhash["Episode Name"]}') 
    stmt.execute() # <-- you're referring to stmt instead of stm here 
    programId = @db.last_insert_row_id 

Вы использовали в данном STM заявление, то обратитесь к stmt.execute() и stmt.close

+1

OH MAN. вот что это было, благодаря XCode не автосохранение моих изменений кода. ха-ха, теперь я чувствую себя глупо за вопрос. – banditKing