Gestion des GUID null dans SQL Server et des jeux de données fortement typés

J'ai une table dans le server SQL:

Categories -------------- CategoryID (uniqueidentifier) ParentCategoryID (uniqueidentifier) allow nulls 

ParentCategoryID est destiné à contenir une valeur dans CategoryID pour indiquer quelle catégorie est le parent. S'il n'a pas de parent (c.-à-d. C'est une catégorie supérieure) alors ParentCategoryID devrait être null.

J'utilise des sets de données fortement typés (adaptateurs de table) et pour les propriétés de ParentCategoryID il ne lui permet pas d'être nul. J'ai essayé de changer les propriétés pour le champ dans l'set de données typé mais il dit qu'essayer de faire un guid "vide" ou "rien" n'est pas valide. La seule option est de lancer une exception sur null. Cela entraîne une erreur:

La valeur de la colonne 'ParentCategoryID' dans la table 'Categories' est DBNull.

Est-ce que c'est le cas, ou existe-t-il un moyen de gérer null GUID / uniqueidentifiers lors de l'utilisation de jeux de données typés?

Si vous avez utilisé les générateurs Visual Studio et que tout est détecté correctement pour votre table, une colonne Nullable générera ce qui suit sur votre DataRow fortement typé:

  1. Une propriété publique nommée pour la table Nom de la colonne ("ParentCategoryID")
  2. Une méthode publique qui détecte une input null ("bool IsParentCategoryIDNull ()")
  3. Une méthode publique qui "annule" l'input ("void SetParentCategoryIDNull ()")

Étant donné que votre table fortement typée est nommée "My" (Génère MyDataTable et MyDataRow ), votre DataSet s'appelle MyDataSetType , et l'instance s'appelle myDataSet :

 MyDataSetType.MyRow row = myDataSet.My.NewMyRow(); row.ParentCategoryID = Guid.Empty; //OPTION 1: explicitly set GUID row.SetParentCategoryIDNull(); //OPTION 2: explicitly set Null myDataSet.My.AddMyRow(row); 

Vous pouvez également regarder l'implémentation de SetParentCategoryID pour voir ce qui est utilisé pour faire un "nulling".

En outre, pour détecter un "null guid":

 if (row.IsParentCategoryIDNull()) { //Do something spectacular } 

Alors maintenant, vous avez trois types de valeurs différents pour représenter l'état:

  1. Entrée null dans la database / dataset (aucune catégorie parente)
  2. input non nulle dans la database (catégorie parente, vraisemblablement)
  3. input non nulle dans la database vide ( Guid.Empty ) guid (???)

Quand j'ai d'abord rencontré ce problème, je pensais que Guid.Empty aurait dû être utilisé pour représenter une input nulle dans la database, mais cela aurait nécessité une gestion personnalisée du type guid. À l'aide des fonctions wrapper, l'set de données fortement typé peut fournir une gestion cohérente de n'importe quel nombre de colonnes nullable basé sur des types de style struct.