SQL ne veut pas préparer ma requête

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

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 !

Édité par Wizix

Mon projet : OpenPlane, un utilitaire en Java pour les pilotes, les vrais !

+0 -0
Auteur du sujet

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…

Édité par Wizix

Mon projet : OpenPlane, un utilitaire en Java pour les pilotes, les vrais !

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

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