il y a quelques années j'ai fait quelque chose comme ça; la base de données était sur les relations académiques/info et j'ai utilisé prolog et ODBC (plus xpce pour le gui).
premier i ouvert une connexion à la base de données:
fconn(C):-
odbc_connect('academia_info', C, [user(academia_info_user),
password(secret), alias(academia_info), open(once)]).
ouvert (une fois) est utilisé pour éviter de reconnecter à la db et C est un gestionnaire
alors j'utilisé ce prédicat pour soumettre des requêtes:
%run_statement(+SQL,-Row)
rs(SQL, Row):-
fconn(Connection),
odbc_query(Connection, SQL, Row).
et si je voulais toutes les solutions que je l'ai fait
%returns all solutions (findall)
%rsall(+SQL,-Rows)
rsall(SQL, Rows):-
findall(Row,rs(SQL,Row), Rows).
par exemple:
rsall('SELECT * FROM institution', D).
ce prédicat prépare une requête SQL:
prep(SQL, Type, Row,Values):-
fconn(Connection),
odbc_prepare(Connection, SQL, Types,Q), %uses the types of the parameters to prepare Q
odbc_execute(Q,Values,Row). %executes Q by replacing the parameters with their values
par exemple:
prep('UPDATE professor SET title = ? WHERE id IN (SELECT professor.id FROM professor, researcher, "hadPosition" WHERE professor.id = researcher.id AND professor.id = "hadPosition".researcher_id AND hadPosition.title = ? AND professor.title=? GROUP BY professor.id HAVING sum("hadPosition".end_date - "hadPosition".start_date) > ?*365)',
[varchar,varchar,varchar, integer],_, [MT, LT,LT, Y]).
où s sont remplacées par les valeurs [MT, LT, LT, Y]
ici je supprime quelques trucs
delete(ID,Table):-
swritef(S,'DELETE FROM %t WHERE id = ?', [Table]),
prep(S, [integer], _ , [ID]).
préparer une déclaration à insérer de nouvelles valeurs (il est exécuté plus tard):
prep('INSERT INTO professor (id, title) VALUES (?,?)', [integer, varchar], _, [ID,T]).
BTW odbc_query retourne une valeur avec la ligne de format suivant (D1, D2, D3, ...., Dn) alors peut-être que vous devrez le convertir en une liste.
J'espère que les exemples ci-dessus pourraient aider .. bien que je l'ai un peu oublié les détails:/ de toute façon, l'ensemble du projet peut être trouvé here mais le code n'est pas lisible si