Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Προβλημα σε Smart Device Project με Merge Replication στο πεδίο RowGuid

Îåêßíçóå áðü ôï ìÝëïò aris_7. Τελευταία δημοσίευση από το μέλος aris_7 στις 10-12-2010, 16:08. Υπάρχουν 3 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  01-12-2010, 01:55 61216

    Προβλημα σε Smart Device Project με Merge Replication στο πεδίο RowGuid

    Θα ηθελα να με βοηθήσει κάποιος αν ξέρει να μου προτίνει κάποια λύση, γιατι ψάχνω παντου και δεν καταφέρνω να βρω άκρη.

    Φτιάχνω ένα Smart Device Project και θέλω να λαμβάνω Data από τον SQL Server

    Αφου κατάφερα να κάνω Merge Replication και να τρέξω την βάση τοπικά στο κινητό, έχει δημιουργηθεί ένα θέμα

    Για το Merge Replication ο SQL Server δημιουργεί σε κάθε πίνακα μία στήλη RowGuid τύπου Guid για να επαληθεύει την μοναδικότητα των δεδομένων (από όσο έχω καταλάβει). Η στήλη αυτή είναι Unique και δεν δέχεται Nulls.

    Το θέμα ειναι, ότι ενώ ο SQL Server από μονος του έχει σαν Default Value το (newsequentialid()), το οποίο με λίγα λόγια λέει στο σύστημα να του αναθέσει το ίδιο μια τιμή, όταν πάω να αποθηκεύσω την  βάση με μία νέα εγγραφή σε ένα DataSet σε ένα Smart Project, μου πετάει Error οτι δεν δέχεται Null το πεδίο RowGuid.. Ταυτόχρονα στο DataSet.xsd παρατήρησα οτι η Default Value του RowGuid είναι Null και δεν μπορώ να την αλλάξω ούτε σε (newsequentialid()) ούτε σε NewID() (οπως κάπου βρήκα στο νετ εναλακτικά ότι θα πρέπει να είναι) καθώς θα πρέπει να δώσω μια τιμή τύπου Guid (XXXX-xXXXX-XXXXXX-XXXXX καπως ετσι).

    Ακόμα, όταν πάω να κάνω αλλαγή σε μία εγγραφή πετάει άλλο Error οτι δεν δέχεται να πάρει τιμές στο RowGuid. Υποθέτω ότι απλά θα στέλνει πίσω το ιδιο RowGuid αλλά ο SQl θα το βλεπει σαν νέα δεδομένα

    Το DataGridView το έχω δημιουργησει αυτόματα (Drag & Drop) και τα Edit και AddNew με αυτόματο τρόπο (EditViewDialog).
    ,
    Χρησιμοποιώ το Studio 2008 και τον SQL Server 2008R2, αν ειχε κανεις το ιδιο πρόβλημα κ το έλυσε ας κάνει τον κόπο να βοηθήσει

    Ευχαριστω εκ των προτέρων
  •  01-12-2010, 08:38 61220 σε απάντηση της 61216

    Απ: Προβλημα σε Smart Device Project με Merge Replication στο πεδίο RowGuid

    Έχεις λόγο να εμφανίζεις αυτό το πεδίο στο DataGridView; Είναι μια πληροφορία που δεν ενδιαφέρει τον χρήστη... Πιστεύω αν το αφαιρέσεις δεν θα έχεις αυτά τα προβλήματα.

     


    Vir prudens non contra ventum mingit
  •  02-12-2010, 20:10 61264 σε απάντηση της 61220

    Απ: Προβλημα σε Smart Device Project με Merge Replication στο πεδίο RowGuid

    Το προσπάθησα αλλά και πάλι το ίδιο.. Στην συνέχεια ενεργοποίησα στο DataSet να δέχεται Null, το πρόγραμμα το δέχεται αλλά μόλις κάνω update στην βάση χτυπάει το μήνυμα για οτι δεν δέχετε Null τιμές στο πεδίο RowGuid. Ακόμα έσβησα το παλιο DataSet και δημιούργησα νέο, χωρίς καθόλου το πεδίο RowGuid αλλά πάλι βγάζει σφάλμα κατά την αποθήκευση στην βάση.

    Από αυτά που βρήκα στο νετ για να μπει νέα εγγραφή θα πρέπει αναγκαστικά στο πεδίο RowGuid να βάλεις την τιμή NewID() ή newsequentialid(), αλλά το Studio δεν σου επιτρέπει να βάλεις τιμές String σε πεδίο τύπου Guid.

    Μηπως τελικά έχω κάνει καποιο σχεδιαστικό λάθος; Η διαδικασία που έκανα είναι να δημιουργησω μία βάση και να την κάνω Replication σε SQL Compact η οποία αποθηκεύεται στον Mobile Emulator (PDA). Στην συνέχεια από το Visual Studio έκανα new Datasource και επέλεξα το αρχείο στο οποίο αποθηκεύεται το replication της βάσης (*.sdf). Μηπως αυτός ο τρόπος δεν είναι τελικά ο σωστός;

    Δεν υπάρχει κανείς άλλος να του έχει παρουσιαστεί το ίδιο πρόβλημα;
  •  10-12-2010, 16:08 61490 σε απάντηση της 61264

    Απ: Προβλημα σε Smart Device Project με Merge Replication στο πεδίο RowGuid

    Η λύση τελικά ήταν ΕΝΤΕΛΩΣ απλή (εώς χαζή), απλά δεν γνωρίζω το θέμα και παιδευόμουνα χωρίς λόγο.. Η τιμή που πρέπει να πάρει για μία νέα μεταβλητή είναι Guid.NewGuid() και το προγραμμα αναθέτει αυτόματα μια νέα τιμή τυπου Guid

    Κατάφερα λοιπόν να κάνω Delete και NewRow το θέμα είναι πλέων πως να κάνω Udpate μια εγγραφή.

    Οταν πας να κανεις αλλαγη σε μια εγγραφή μέσω του DataTableAdapter χρησιμοποιώντας την εντολή myDataAdapter.Update() από Default έχει σαν είσοδο τα πεδία του πίνακα που θέλουμε να αλλάξουμε σε σειρά (και το πεδίο RowGuid), χωρίς όμως το πεδίο - κλειδί (πχ ID) , και μετά πέρνει 2 επιπλέων ορίσματα: το πεδίο - κλειδί (πχ ΙD) και το rowguid για επιβεβαίωση της εγγραφής που θέλουμε να παραμετροποιήσουμε. Βέβαια δεν είναι επιτρεπτό να πειράξεις τα πεδία στο Rowguid (οπως και το πεδίο κλειδί) και χτυπάει σφάλμα κατα την εκτέλεση της εντολής

    Η λύση έρχεται χειροκίνητα επεμβένοντας στο XSD.cs. Εκει πρέπει να βρούμε την εντολή που κάνει Update το DataTable σε κώδικα SQL (στην δικιά μου περίπτωση this._adapter.UpdateCommand.CommandText) και να αφαιρέσουμε από τον κώδικα SQL το πεδίο RowGuid όπου το κάνει Update. Αν θέλουμε μπορούμε να αλλάξουμε και τα ορίσματα που πέρνει η Update (για ευκολία γράφουμε κάπου στο πρόγραμμα, πχ στο Form1.Cs, την εντολή myTableAdapter.Update() και με δεξί κλικ πατάμε στο GoToDefinition και μας πηγαίνει αυτόματα). Εκεί μπορούμε να σβήσουμε εντελώς το όρισμα RowGuid για την εντολη Update του συγκεκριμένου πίνακα. Αν όχι μπορουμε απλά να βάζουμε οτι ορίσματα θέλουμε στο RowGuid στην Update (οχι ομως Null) αφού έτσι κ αλλιώς δεν λαμβάνονται υπόψην

    Τα γράφω όλα αυτά σε περίπτωση που κάποιος κολλήσει στο ίδιο πρόβλημα με εμένα

    Το θέμα είναι οτι η αυτόματη δημιουργία φορμών του Studio 2008 δεν δουλεύει (τουλάχιστον όχι χωρίς παραμετροποιήσεις) σε περιπτώσεις Database από Merge Replications. Θα έπρεπε το σύστημα αυτόματα να ξεχώριζε αυτην την περίπτωση, αλλά δεν το κάνει. Οπότε στην δικιά μου περίπτωση τα έκανα ΟΛΑ ΧΕΙΡΟΚΙΝΗΤΑ (οι φόρμες δλδ, όχι το Dataset) και δούλεψαν!

Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems