|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Jul 2005
Città: Canelli
Messaggi: 158
|
[C++][Database] come fare a salvare e recuperare gli oggetti di un programma C++
Cerco di spiegarmi
![]() Vorrei poter salvare e leggere gli oggetti di un programma c++ che normalmente vengono gestiti in memoria appoggiandomi possibilmente ad un programma di gestione di database sql (cosa mi consigliate? mysql, firebird o ?). La massa dei dati dovrebbe risiedere sul database su disco, mentre in memoria dovrebbero andare i dati da elaborare, il tutto gestito nel modo più trasparente possibile. L'ideale sarebbe che nel momento in cui definisco e implemento una classe nel programma sia possibile con pochi semplici passaggi riportarne la struttura sul database in modo che sia semplice salvare gli oggetti o richiamarli alla bisogna realizzando su disco una copia degli oggetti in memoria che mi servono. Qualcuno cortesemente potrebbe fornirmi spiegazioni o segnalarmi tutorial ed esempi? o almeno suggerirmi qualche punto da dove partire? Grazie ![]() |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Feb 2001
Città: Foggia
Messaggi: 2519
|
se non è tanta roba forse è inutile scomodare un DB puoi usare un file XML
![]()
__________________
mi sembra di essere tornato adolescente ai bei tempi.. che figata essere di nuovo su questo forum ![]() |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
praticamente ti serve un sistema di serializzazione per C++ che maschera un database. realizzare un sistema di serializzazione generico per C++ non é facile (per non dire che é semplicemente impossibile) visto che C++ non é un linguaggio riflessivo, cioé non é dotato di reflection.
come al solito mi vengono in mente COM e le tecnologie attive (non so se ADO c'entra qualcosa), ma forse ci sono delle possibilitá piu semplici. attendi qualche parere piu esperto, altrimenti da parte mia hai lo spunto per COM ![]() |
![]() |
![]() |
![]() |
#4 | |
Member
Iscritto dal: Jul 2005
Città: Canelli
Messaggi: 158
|
Quote:
Il database era per avere la possibilità di sfruttare al meglio le funzionalità e l'efficienza del "motore" SQL. Le funzionalità essenziali che mi servono sono: Date una o più classi trasferirne la struttura sul DB salvare oggetti sul DB con le loro varie relazioni caricare oggetti dal DB ripristinando le corrette relazioni eliminare oggetti dal DB la massa dei dati deve stare nel database in memoria devono stare i dati in elaborazione e gli oggetti temporanei se il passaggio tra dati su database e dati in memoria fosse gestito in maniare trasparente sarebbe ottimo ![]() scusate se non sono molto chiaro ![]() |
|
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
I database supportati sono praticamente tutti quelli in circolazione. |
|
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Non mi risultano esistere ORM in C++. Altrimenti usi i tradizionali strumenti messi a disposizione dai database: stored procedure e viste. |
|
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
Ma se non deve gestire vagonate di record forse potrebbe evitare l'ORM appoggiandosi direttamente ad un database ad oggetti, invece che relazionale. Oppure provare ad usare qualcosa di diverso come un Prevalent System (se i requisiti lo permettono). In entrambi i casi non so quali datbase/librerie esitano allo scopo (per C++). @EDIT: la relativa voce su wikipedia (sperando che nessuno resti disgustato ![]()
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) Ultima modifica di banryu79 : 12-05-2010 alle 08:28. |
|
![]() |
![]() |
![]() |
#8 | |
Member
Iscritto dal: Jul 2005
Città: Canelli
Messaggi: 158
|
Quote:
![]() E Ricorrendo ad altri linguaggi come Python o Java? Dici che dovrebbero essere più adatti, questi almeno sono linguaggi riflessivi? Vorrei però rimanere sul C++ che conosco meglio (Molto Molto relativamente ![]() Grazie per gli spunti interessanti ![]() |
|
![]() |
![]() |
![]() |
#9 | |
Member
Iscritto dal: Jul 2005
Città: Canelli
Messaggi: 158
|
Quote:
|
|
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
La reflection non c'è in c++, ma volendo un approccio valido alla serializzazione si può ottenere con typeid: http://en.wikipedia.org/wiki/Typeid
Quindi la serializzazione è abbastanza facile da realizzare, sia implementandola tramite una classe base astratta, sia utilizzando librerie esterne (le boost hanno la serializzazione). In alternativa si può usare un db su file, come sqlite, che si può integrare facilmente e con praticamente nessuna dipendenza. |
![]() |
![]() |
![]() |
#11 | |
Bannato
Iscritto dal: Jan 2003
Città:
Messaggi: 4421
|
Quote:
...ciao Andrea... |
|
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
|
![]() |
![]() |
![]() |
#13 |
Bannato
Iscritto dal: Jan 2003
Città:
Messaggi: 4421
|
|
![]() |
![]() |
![]() |
#14 | |
Member
Iscritto dal: Jul 2005
Città: Canelli
Messaggi: 158
|
Quote:
Sì in effetti quello che mi servirebbe è un ORM tipo hibernate a cui ho dato un'occhiata, peccato sia per java. Esiste qualcosa di simile ad hibernate in C++ ????? |
|
![]() |
![]() |
![]() |
#15 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Non ti basta da solo, serve anche un DBMS...ed i DBMS supportati sono
* Oracle * PostgreSQL * MySQL Quindi DBMS molto corposi e che necessitano di una installazione. Ribadisco quindi che la soluzione è farti la serializzazione o a manina o tramite boost. In alternativa sqlite come database embedded. |
![]() |
![]() |
![]() |
#16 | |
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
|
|
![]() |
![]() |
![]() |
#17 |
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Purtroppo no.
Se c'è un settore dove C++ è molto indietro è proprio quello dell'interfaccia verso i database e non credo che ci saranno mai evoluzioni in tal senso, ormai il treno è perso in favore di linguaggi come Java e C#. |
![]() |
![]() |
![]() |
#18 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
|
![]() |
![]() |
![]() |
#19 | |
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Con Sqlite non ho trovato limitazioni anche perchè se manca qualche funzionalità è possibile accedere direttamente alle api del backend, per quanto riguarda SqlServer credo che sia dovuto al parziale supporto alle stored procedure, supporto facilmente realizzabile aggiungendo 2 elementi ad un enum e gestendoli opportunamente nel backend odbc, ho contattato il mantainer del progetto per proporgli la mia modifica, ma non ho avuto risposta. Ho usato intensivamente il backend odbc e non ho riscontrato problemi, con questa libreria riesco a coprire il 100% delle mie casistiche di utilizzo dei db con prestazioni sorprendenti visto che nelle prove che ho fatto è risultata pure più veloce del TDS implementato in ADO.NET (non si diceva che odbc era obsoleto e lento?) |
|
![]() |
![]() |
![]() |
#20 | |
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
Quote:
inoltre, in fase di lettura, una volta che abbiamo letto il nome del tipo dell'oggetto salvato o che siamo riusciti a ricavarne l'oggetto std::type_info che ci si fa? come facciamo ad istanziare quel tipo? |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 17:42.