Προς το περιεχόμενο

C++, XML, Access σε ένα...


SweetChild

Προτεινόμενες αναρτήσεις

Δημοσ.

Εχω μια εργασια που τεινει να φτασει στο φιναλε. Απλα εχω 2 μικροπροβληματακια με το κομματι της xml.

Το προγραμμα μου (σε c++ visual builder) καταχωρει δεδομενα απο βιντεο τα οποια διαλεγει ο χρηστης, τα αποθηκευει σε βαση δεδομενων (access) και τα εξαγει σε xml αρχειο.

Ειχα βαλει μια εντολη που τα εξηγαγε σε xml, αλλα δεν τα εβγαζε κανονικα. Σε τετοια μορφη ωστε να μπορω να κανω και εισαγωγη απο xml (προς τη βαση).

Υπαρχει καποιος που να μπορει να με βοηθησει σε αυτο?...

Εχω ψαξει αμετρητες ωρες στο ιντερνετ και δεν βρηκα στοιχεια που να βοηθουν.

Στην ουσια ζηταω μια εντολη (στην c++) που να εξαγει την βαση στο xml. (Μεσα απο την Access αυτο γινεται πανευκολα. Αλλα φανταζομαι η c++ δεν μπορει να ανοιξει την βαση και να ζητησει Αρχειο-> Εξαγωγή απ αυτην.)

Και αν υπαρχει καποια αντιστοιχη εντολη που να κανει το αντιθετο. Να εισαγει απο την xml...

 

Απαντησεις μεσα σε 10 μερες γιατι μετα παραδιδωωωωωω... :fear:

Pleeeaaase helppp...

Δημοσ.

Αν δουλευεις σε .NET τοτε το datatable εχει μια μεθοδο που σου δινει την δυνατοτητα να κανεις dump to schema της βασης μαζι με τα δεδομενα σε xml στον δισκο. Απλα τωρα δεν θυμαμαι ποια ειναι. Αλλιως θα πρεπει να φτιαξεις εσυ το xml αρχειο...Δες πως φτιαχνει το xml η access και καντο με τον ιδιο τροπο ;)

Δημοσ.

Isim: Δουλευω σε Visual c++ της Builder. Δεν ειναι .NET

Οποτε κατι τετοιο απ οσο ειδα δεν κανει. Ή τουλαχιστον δεν το ξερω... (στην ουσια αυτο ζηταω)

 

Μονη μου μπορω να φτιαξω το xml αρχειο απο την βαση. Απλα το σωστο ειναι να το κανει το προγραμμα μου.

 

Πάρη: ειχα γραψει την εξης εντολη ADOTable1->SaveToFile("C:/DataToXml.xml",pfXML);

όπου ADOTable1 ειναι ενα ερωτημα που εφτιαξα στην βαση και απλα το εκτελει.

Αλλα (αν ξερεις ακριβως απο xml) δεν μου βγαζει καν επανω τι version ειναι, τι encording χρησιμοποιω... και τα λοιπα.. Και φυσικα αυτο δεν με βοηθαει και στην εισαγωγη απο xml. Γιατι οπως την κανω απο την βαση μεσα (πανευκολο) δεν αναγνωριζει τους πινακες και τα δεδομενα τους.

Δημοσ.

Ισως υπάρχει καποια δυνατότητα αλλά δεν χρησιμοποιεις το Νετ να μπορει καποιος να βοηθησει.Εννοεις πως δεν βγάζει αυτα;

<?xml version="1.0" encoding="ISO-8859-1"?>

Απο οτι ειδα η εξοδος ADOTable1->SaveToFile("C:/DataToXml.xml",pfXML); δεν ειναι συμβατή με αλλα προγραμματα.

Αλλα ειναι συμβατη με το προγραμμα σου.Αν δοκίμαζες την LoadFromFile που ειναι συμβατή; Και να τη φορτωνεις στην αcess μεσω του προγραμματος σου.Κατευθειαν ισως μονο αν εγραφες το δικο σου αρχειο δηλαδή να εκανες κωδικα να τα εξαγει οπως θες

Δημοσ.

Μπααα... τετοιο πραγμα δεν παιζει... Να φτιαξω κωδικα να το βγαζει. Γιατι εκτος του οτι θελει ποοοολυ καιρο, δεν εχω και την γνωση.

Ειναι συμβατη με το προγραμμα μου αλλα δεν εξαγει οπως θελω. Δεν ξερω αν υπαρχει παρομοια εντολη ή με αλλο format της XML ωστε να το βγαζει σωστα (οπως εδειξες κι εσυ).

Το LoadFromFile που να το χρησιμοποιησω ακριβως? Στο να φορτωσω δεδομενα απο την xml στην βαση?

Αυτο το δοκιμασα αλλα δεν γινεται. Γιατι η διαδικασια ειναι περιπλοκη. Πρεπει να φιλτραρει ολα τα δεδομενα των πινακων και τις καταχωρησεις τους και να δημιουργησει ιδια βαση με ιδια δεδομενα. Πραγμα που δεν γινεται με μια εντολη.

 

Εκτος κι αν εννοεις να το δοκιμασω για να κανω LoadFromFile απο την Access και να μετατρεψω σε xml. Δεν το γνωριζω καθολου αυτο...

Δημοσ.
[..]σε c++ visual builder[..]

 

Δουλεύεις σε C++ Builder.

 

Υ.Γ.

Φαίνεται ότι το ADO 2.5+ υποστηρίζει το Export & Import ενός Table από & σε XML, ακολουθεί κώδικας σε VB: http://www.freevbcode.com/ShowCode.Asp?ID=1204

 

Από ότι βλέπω μπορείς να προσπελάσεις το ADO engine σχεδόν απευθείας με την βοήθεια του ADOTable->Recordset αν βρω κάτι πιο συγκεκριμένο θα σου πω.

 

Ακόμα καλύτερα υπάρχει κώδικας σε Delphi που αποθηκεύει & φορτώνει ADO -> XML, εδώ:

http://www.delphi3000.com/articles/article_3416.asp?SK=

 

Δεν έχω ασχοληθεί με αυτό το ζήτημα στον C++ Builder ώστε να γίνω πιο αναλυτικός, καθώς τις DB ανάγκες μου, τις καλύπτω με την SQLite.

Δημοσ.

Εννοω οτι αποθηκευεις το αρχειο με την SaveToFile και το διαβάσεις με την LoadFromFile και τα βαζεις στο access.Kαπως ετσι

ADOTable1->LoadFromFile('blah.xml');

Παραπάνω δεν μπορω να σε βοηθησω δεν εχω αλλες γνωσεις για αυτο το συστημα.Ψαξε για xml translator απο ado xml κατι ισως βοηθησει

Δημοσ.

Direct θα τα ριξω μια ματια ολα αυτα... Εχω και ενα βιβλιο που ισως με βοηθησει.

 

Πάρη καταλαβα τι λες. Το ειχα δοκιμασει αλλα δεν... Κι αυτο που εκανα παλι σωστο δεν ειναι. Χθες εφαγα 4 ωρες να ψαχνω για το xml translator και γενικα για την συνδεση αυτων. Αλλα δεν υπαρχουν βοηθηματα που να εξηγουν εστω τα απλα.

 

Βασικα το θεμα ειναι οτι δεν γνωριζω αν υπαρχει λυση (εντολη) απο την c++ να γινει αυτο ή αν ψαχνω τζαμπα τοσο καιρο. Δηλαδη αν υποστηριζει τετοια εξαγωγη η γλωσσα αυτη.

Δημοσ.

Έπαιξα λίγο με τις εντολές TADOTable->SaveToFile("filename", 1); & TADOTable->LoadFromFile("filename"); -ο αριθμός 1 δηλώνει ότι θέλουμε PersistantXML (ουσιαστικά είναι το XML flag του ADO).

 

Πρόσεξε τώρα.. Το SaveToFile δημιουργεί πράγματι ένα XML αρχείο.

Το LoadToFile επίσης φορτώνει αυτό το αρχείο, δεν χτυπά, δεν επιστρέφει κάποια εξαίρεση, οπότε όλα καλά.

Που είναι το πρόβλημα; Όταν δοκιμάζεις να εξετάσεις την Β.Δ. που είναι αποθηκευμένη στον δίσκο, μετά την LoadToFile είναι κενή (για παράδειγμα) ενώ εμείς έχουμε φορτώσει από το XML backup της πχ 3 records, που είναι λοιπόν αυτά τα Records; ..

Τι συμβαίνει; Λοιπόν από το documentation μαθαίνουμε ότι η LoadToFile κλείνει την τρέχουσα Β.Δ. και ανοίγει εκείνη της XML.

Συνεπώς όταν δοκίμασα να δω αν όντος το LoadToFile φόρτωσε πραγματικά τα 3 record που δημιούργησα πειραματικά για το XML, είδα ότι υπήρχαν (τουλάχιστον αριθμητικά -3-) με την βοήθεια της ADOTable1->RecordCount στο TADOTable!

 

***

Συνεπώς το Save & Load δουλεύουν, μόνο που το Load από XML θα πρέπει να γίνει μάλλον σε ένα ανεξάρτητο TADOTable και ύστερα θα πρέπει να κάνεις υποθέτω .. αντιγραφή των περιεχόμενων του στο TADOTable της φυσικής Β.Δ. που χρησιμοποιείς.

***

 

Μπορεί να κάνω λάθος βέβαια ....

Δημοσ.

Βασικα ενα θεματακι ειναι οτι το ADOTable1 ειναι στην ουσια ερωτημα. Δημιουργησα ενα απο την βαση , το οποιο εμφανιζει ολα τα δεδομενα απο ολους τους πινακες (τρεις). Αυτο ειναι ευκολο στο να εξαγεις.. γιατι στην ουσια διαβαζει το ερωτημα (το οποιο βγαζει ολα τα δεδομενα) και το τρεχει/εμφανιζει στην xml.

Το να το εισαγεις ομως... δεν αντιλαμβανομαι πως γινεται. Γιατι πρεπει να δημιουργησει απο το τιποτα 3 πινακες με ιδια πεδια. Δλδ το TADOTable->LoadFromFile("filename"); δεν πρεπει να ναι τοσο απλο οσο ακουγεται...

 

Τωρα δεν ξερω αν ειναι εφικτο να υπαρχει εντολη που να διαβαζει ολο το xml και να μπορει να ξεχωρισει τους πινακες και να τους δημιουργει. Ή αν τελικα πρεπει να γινουν 3 ερωτηματα για την εξαγωγη και 3 για την εισαγωγη. Ενα για καθε πινακα..

Δημοσ.
Βασικα ενα θεματακι ειναι οτι το ADOTable1 ειναι στην ουσια ερωτημα. Δημιουργησα ενα απο την βαση , το οποιο εμφανιζει ολα τα δεδομενα απο ολους τους πινακες (τρεις). Αυτο ειναι ευκολο στο να εξαγεις.. γιατι στην ουσια διαβαζει το ερωτημα (το οποιο βγαζει ολα τα δεδομενα) και το τρεχει/εμφανιζει στην xml.

Το να το εισαγεις ομως... δεν αντιλαμβανομαι πως γινεται. Γιατι πρεπει να δημιουργησει απο το τιποτα 3 πινακες με ιδια πεδια. Δλδ το TADOTable->LoadFromFile("filename"); δεν πρεπει να ναι τοσο απλο οσο ακουγεται...

 

Τωρα δεν ξερω αν ειναι εφικτο να υπαρχει εντολη που να διαβαζει ολο το xml και να μπορει να ξεχωρισει τους πινακες και να τους δημιουργει. Ή αν τελικα πρεπει να γινουν 3 ερωτηματα για την εξαγωγη και 3 για την εισαγωγη. Ενα για καθε πινακα..

 

Το μόνο που μπορώ να σου πω είναι ότι σύμφωνα με το documentation το TADOTable->LoadFromFile:

 

"LoadFromFile closes the dataset component before loading the recordset from the file specified in FileName."

 

Ύστερα και λογικά να το δεις, κάνεις LoadFromFile προς το TADOTable, δεν σημαίνει ότι κάνεις Import κάτι, απλά ανοίγεις, ανακατευθύνει το TADOTable σε αυτό το αρχείο.

 

Συνεπώς ( ???? ) θα πρέπει να προβείς σε κάποια μορφή αντικατάστασης batchupdate, cloning κτλ. από τα περιεχόμενα αυτού του TADOTable στα TADOTable που χρησιμοποιείς. Τώρα αν μπορεί να γίνει πιο εύκολα (αυτόματα δίχως περισσότερο κώδικα) δεν γνωρίζω.

Δημοσ.

Κοιταξα καποια πραγματα απο αυτα που μου υπεδειξες. Βρηκα και κατι αλλες χρησιμες σελιδες.

Προσπαθω να το κανω με ADODataSet.

Η εισαγωγη του με παιδευει λιγο. Θελει να γραψω οπωσδηποτε ερωτημα δημιουργιας πινακων. Αλλα εγω ηθελα να δεχεται τους ιδιους ακριβως.

Οντως το LoadFromFile σκετο δεν κανει τπτ.. λογικα χρειαζεται κι αλλος κωδικας. Θα ψαξω λιγο ακομα κι αν δεν γινεται τιποτα παλι θα σας επικαλεστω μπας και βγαλουμε ακρη... :-)

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...