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

 

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

new record with uniqueidentifier as primary key

Îåêßíçóå áðü ôï ìÝëïò dkou. Τελευταία δημοσίευση από το μέλος Markos στις 06-04-2009, 00:09. Υπάρχουν 6 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  05-04-2009, 21:17 49877

    new record with uniqueidentifier as primary key

    Visual studio 2008, winform project.

    Φτιάχνω μια db σε sql server, 2 πίνακες, master child με primary keys σε uniqueidentifiers τα master pmkeys με rawguid για να φτιάχνονται αυτόματα από την μηχανή του sql server κατά την προσθήκη νέας εγγραφής.

    Φτιάχνω το dataset στο vs και "τραβάω" τους πίνακες στην φόρμα. Βάζω και ένα db navigator control και είμαι έτοιμος να δοκιμάσω.

    Δημιουργώ μία νέα εγγραφή με το + του db navigator και παρατηρώ πως το πεδίο masterID του table1 όπως φαίνεται στο grid είναι κενό. Πατάω save και μου λέει πως το πεδίο masterID δεν μπορεί να είναι NULL.

    Τι γίνεται εδω ? Δεν δημιουργήθηκε το guid από τον SQL server στην νέα εγγραφή ? Κάτι τρέχει με το dataset ? Κάτι συμβαίνει με τον bindingsource ? Πρέπει να κάνω κάτι και δεν το έχω κάνει ?

    Ευχαριστώ,

    Δ.Κ.

  •  05-04-2009, 21:30 49878 σε απάντηση της 49877

    Απ: new record with uniqueidentifier as primary key

    Καλησπέρα, έχω τα εξής ερωτήματα:

    1. Ποιον sql server χρησισμοποιείς, 2005 ή 2008;

    2. Ποιο είναι το ακριβές μήνυμα που σου βγάζει;;

    3. Έχεις ορίσει κάποιες σχέσεις μεταξύ των πινάκων;
  •  05-04-2009, 22:09 49880 σε απάντηση της 49878

    Απ: new record with uniqueidentifier as primary key

    Καλησπέρα και ευχαριστώ για την άμεση ανταπόκριση.

    Χρησιμοποιώ SQL server 2005 και υπάρχει μία σχέση μεταξύ του master table και του child table. Το master table περιέχει τα πεδία masterID (rawguid) και masterNAME (nvarchar). ToΟ child table περιέχει τα πεδία childID (rawguid), masterchildID(guid και παίρνει τιμή μέσα από την σχέση το masterID του master table) και childNAME (nvarchar).

    Στον dataset designer του visual studio 2008 βλέπω κανονικά τους πίνακες και την σχέση όπως αυτά ορίζονται και στον sql server. Βέβαια στο sql management studio το πεδίο masterID (master table) έχει τιμή NEWID στο defaultvalue, σε αντίθεση με το <DBNull> που υπάρχει στο defaultvalue του πεδίου στον dataset designer του VS (το οποίο δεν με αφήνει να το αλλάξω).

    Όταν δημιουργώ "χειροκίνητα" μια νέα εγγραφή από το sql management studio παρατηρώ πως τα κλειδιά δημιουργούνται κανονικά και δεν υπάρχει πρόβλημα. Το πρόβλημα εντοπίζεται όταν προσπαθώ να προσθέσω μία εγγραφή στο grid (devexpress) σε μία winform. Σε αυτό το σημείο λοιπών μου βγάζει το μήνυμα "Colum 'masterID' does not allow nulls". Είναι σαν να μην επιστρέφει το κλειδί ο sql στο grid ή στο tableadapter.

    Είναι η πρώτη φορά που χρησιμοποιώ guid για primary keys. Στο παρελθόν με int primary keys δεν είχα κανέναν πρόβλημα και έκανα ακριβώς τα ίδια πράγματα. Μήπως πρέπει να παίξω στον κώδικα του tableadapter να "πιάσω" κανένα event ? Δεν μπορώ να καταλάβω τι γίνεται.

    Ευχαριστώ,
    Δ.Κ.

  •  05-04-2009, 22:30 49882 σε απάντηση της 49877

    Απ: new record with uniqueidentifier as primary key

    Το έλυσα. Για κάθε tableadapter, είπα στο ontablenewrow να φτιάχνει ένα guid και έκανα override το endedit. Τώρα παίζει άψογα αλλά... παράξενο δεν είναι ?

    using System.Data;
    using System;

    namespace WindowsFormsApplication1 {  
        
        public partial class testDataSet
        {
            partial class masterDataTable
            {
                protected override void OnTableNewRow(System.Data.DataTableNewRowEventArgs e)
                {

                    base.OnTableNewRow(e);
                    ((masterRow)e.Row).masterID = Guid.NewGuid();
                }

                public override void EndInit()
                {
                    base.EndInit();
                    this.TableNewRow += delegate(object sender, DataTableNewRowEventArgs e) { };
                }
            }

            partial class childDataTable
            {
                protected override void OnTableNewRow(System.Data.DataTableNewRowEventArgs e)
                {
                    base.OnTableNewRow(e);
                    ((childRow)e.Row).childID = Guid.NewGuid();
                }

                public override void EndInit()
                {
                    base.EndInit();
                    this.TableNewRow += delegate(object sender, DataTableNewRowEventArgs e) { };
                }
            }
        }
    }

    Δημοσίευση στην κατηγορία: ,
  •  05-04-2009, 23:05 49885 σε απάντηση της 49882

    Απ: new record with uniqueidentifier as primary key

    Όχι δεν είναι παράξενο. Όταν ορίζεις ένα PK τύπου Int και Ιdentity στον SQL Server, αυτό στο DataSet αντιστοιχεί σε DataColumn με properties όπως:

    AutoIncrement: True
    AutoIncrementSeed: 0
    AutoIncrementStep: 1

    Όταν το DataType είναι System.Guid, το DataColumn δεν υποστηρίζει αυτόματο generation του Guid καθώς δεν έχει properties που να μπορούν να κάνουν αυτή τη δουλειά. Δυστυχώς δεν μπορεί επίσης να χρησιμοποιηθεί το Expression ptoperty γιατί ούτε κι εκεί υπάρχει συνάρτηση που να επιστρέφει Guid. Οπότε, θα πρέπει να παράγεις δυναμικά το Guid πριν να πάει να περαστεί η εγγραφή στη βάση. Ένας τρόπος είναι αυτός που χρησιμοποίησες.


    Vir prudens non contra ventum mingit
  •  05-04-2009, 23:29 49886 σε απάντηση της 49885

    Απ: new record with uniqueidentifier as primary key

    KelMan:

    Όχι δεν είναι παράξενο. Όταν ορίζεις ένα PK τύπου Int και Ιdentity στον SQL Server, αυτό στο DataSet αντιστοιχεί σε DataColumn με properties όπως:

    AutoIncrement: True
    AutoIncrementSeed: 0
    AutoIncrementStep: 1

    Όταν το DataType είναι System.Guid, το DataColumn δεν υποστηρίζει αυτόματο generation του Guid καθώς δεν έχει properties που να μπορούν να κάνουν αυτή τη δουλειά. Δυστυχώς δεν μπορεί επίσης να χρησιμοποιηθεί το Expression ptoperty γιατί ούτε κι εκεί υπάρχει συνάρτηση που να επιστρέφει Guid. Οπότε, θα πρέπει να παράγεις δυναμικά το Guid πριν να πάει να περαστεί η εγγραφή στη βάση. Ένας τρόπος είναι αυτός που χρησιμοποίησες.



    Εκ των πραγμάτων αυτό υπέθεσα και εγώ. Μου φάνηκε παράξενο το γεγονός ότι δέν υπάρχουν properties που διενεργούν το αυτόματο generation του GUID μιας και η χρήση του uniqueidentifier είναι μια καλή πολιτική. Μήπως θα μπορούσες να αναπτύξεις τους άλλους τρόπους δυναμικής παραγωγής του guid ή να τους αναφέρεις εν τάχει έστω. Φαντάζομαι bindingsource addingnew και tableadapter insert με NEWID().

    Όπως είπα είναι η 1η φορά που χρησιμοποιώ guid και νομίζω ότι είναι αρκετά ενδιαφέρον και "ασφαλέστερο" του int. Προσωπικά θα ήθελα να ξέρω ποια είναι η καλήτερη μέθοδος αυτόματης παραγωγής των uids έτσι ώστε να είμαι safe στο μέλον.

    Ευχαριστώ
  •  06-04-2009, 00:09 49891 σε απάντηση της 49886

    Απ: new record with uniqueidentifier as primary key

    Νομίζω μια άλλη ύση θα ήταν να χρησιμοποιήσεις το AddingNew event του bindingsource και να το παράγεις εκεί.
    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems