SQL ne veut pas préparer ma requête

Le problème exposé dans ce sujet a été résolu.

Bonjour,
Je me suis initié il y a peu à SQLite pour un programme de gestion d'argent de poche. Celui-ci comprend un historique et c'est là que la base de donnée intervient. Le logiciel comprend trois classes pour le moment :

  • Money Qui sert à afficher correctement au format monétaire, et quelques conversions vers d'autre système monétaire que l'Euro.
  • Transaction Qui représente une transaction ([ajout/retrait], montant, date, commentaire). Montant est une instance de la classe Money.
  • History Qui est la fameuse classe de l'historique.

Voici donc le code de History :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#!/usr/bin/env ruby
# encoding: utf-8

require "sqlite3"
require_relative "Transaction"

class History
    def initialize()
        begin
            @db = SQLite3::Database.open "history.db"
            @db.execute 'CREATE TABLE IF NOT EXISTS History(Id INTEGER PRIMARY KEY AUTOINCREMENT, Type TEXT, Amount INT, Date TEXT, Comment TEXT);'
        rescue SQLite3::Exception => e
            puts "Exception occured : (init)"
            puts e
        end
    end

    def write(transaction)
        begin
            rep = @db.prepare 'INSERT INTO History(Type, Amount, Date, Comment) VALUES(?, ?, ?, ?);'
            prep.bind_params(transaction.type, transaction.amount.value, transaction.date, transaction.comment).execute
            prep.close
        rescue Exception => e
            puts "Exception occured : (write)"
            puts e
        end
    end

    def close
        @db.close if @db
    end
end

if __FILE__ == $0
    t = Transaction.new("+", 45.26, "Merci mamie!")
    h = History.new
    h.write(t)
    h.close
end

Et voici l'erreur :

1
2
3
4
5
Exception occured : (write)
undefined method `execute' for ["+", 45.26, "2015-02-19 08:36:13", "Merci mamie!"]:Array
History.rb:29:in `close': unable to close due to unfinalized statements or unfinished backups (SQLite3::BusyException)
    from History.rb:29:in `close'
    from History.rb:37:in `<main>'

Donc on apprend que l'erreur vient de la méthode History::wite. Comment puis-je exécuter cette requête ? Je comprend bien que je ne peut pas utiliser la méthode execute sur un objet de type Array, mais je ne vois pas comment faire autrement…

Merci de votre aide !

+0 -0

t = Transaction.new("+", 45.26, "Merci mamie!")

INSERT INTO History(Type, Amount, Date, Comment) VALUES(?, ?, ?, ?);

Il chercherait pas la date au moment de l'insertion ?

Xalfen

Je ne pense pas car la date est donnée dans la méthode bind_params (la date est instanciée automatiquement au moment de la création d'un objet Transaction) :

1
prep.bind_params(transaction.type, transaction.amount.value, transaction.date, transaction.comment)

EDIT : J'ai trouvé la solution… Mais je ne la comprend pas. Voici le code de la méthode write :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
def write(transaction)
    begin
        prep = @db.prepare 'INSERT INTO History(Type, Amount, Date, Comment) VALUES(?, ?, ?, ?);'
        prep.bind_params(transaction.type, transaction.amount.value, transaction.date, transaction.comment)
        prep.execute
        prep.close
    rescue Exception => e
        puts "Exception occured : (write)"
        puts e
    end
end

Il semble de prep.execute doit être sur une nouvelle ligne… Ou que la méthode execute doit être directement placée sur l'objet. Je ne sais pas trop…

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte