2010-07-06 19 views
0

J'ai des DataTables avec une colonne ID avec AutoIncrement activée à la fois du côté du serveur MySQL et du côté du schéma ADO.NET (chargé à partir d'un fichier de schéma XML). Je ne voudrais pas avoir à me soucier de ces identifiants lors de l'insertion de lignes car leur seule utilisation est d'avoir une clé primaire pour la table - il n'y a pas de références de clés étrangères. Toutefois, le DataTable contiendra déjà des lignes lorsque les nouvelles lignes doivent être ajoutées, i. e. les lignes avec des ID à partir de 1 résident déjà dans le DataTable. La valeur par défaut d'AutoIncrementSeed pour la colonne ID est -1 et la valeur AutoIncrementStep est 1 (il ne reste que les valeurs par défaut fournies par Visual Studio).ConstraintException sur DataTable.Rows.Add avec AutoIncrement Colonne

Tout semble être tout à fait bien si je veux seulement insérer deux nouvelles lignes à la fois, parce que lors de sa création avec DataTable.NewRow() ils obtiennent les ID -1 et 0. Mais si je veux ajouter une troisième ligne, il obtient l'ID 1 attribué par NewRow(). Par la suite une contrainte ConstrException est levée lorsque je veux insérer la nouvelle ligne avec dataTable.Rows.Add (...) parce qu'il y a déjà une ligne avec ID = 1.

Je suppose que la désactivation de la fonction AutoIncrement pour ADO.NET schéma n'est pas une solution parce que je devrais encore m'assurer que les ID sont uniques avant d'ajouter les lignes avec .Rows.Add()

Ce qui serait une solution facile/élégante de ce problème? En ce moment je ne peux pas imaginer que c'est une tâche très rare.

Merci!

Répondre

1

Une manière très simple de résoudre ce problème est de définir la propriété AutoIncrementStep à -1 et - alors les ID diminuera-à-dire, -1, -2, -3, etc.

Hope this helps, Steve

0

Pouvez-vous essayer quelque chose de semblable à l'exemple que je vous ai fourni ci-dessous. Vous pouvez vérifier si la valeur de la colonne unique existe déjà en utilisant le produit sur la table avant d'ajouter une autre ligne:

using (SqlConnection connection = new SqlConnection(sqlConnectionStr)) 
     { 
      connection.Open(); 
      // Do work here. 
      DataTable userTable = new DataTable("usertable"); 

      using (SqlCommand sqlCmd = new SqlCommand("select * from [user]")) 
      { 
       sqlCmd.Connection = connection; 
       SqlDataAdapter dataAdapter = new SqlDataAdapter(sqlCmd); 
       dataAdapter.Fill(userTable); 
      } 

      int newUserId = 3; 
      DataRow[] selectedRows = userTable.Select( string.Format("id={0}", newUserId)); 
      bool userIdAlreadyTaken = selectedRows.Length > 0 ; 
      if(!userIdAlreadyTaken) 
      { 
       // Add new user 
       DataRow newRow = userTable.Rows.Add(new object[] { 3, "John" }); 
      } 
     } 
+0

Merci pour votre réponse, mais je pense que je cherchais quelque chose de différent. Votre approche devrait fonctionner mais mon but était de l'organiser de manière à ce que je n'aie plus à assigner ou vérifier les identifiants. Tous les identifiants attribués "hors ligne" ne le font jamais dans la base de données MySql car l'instruction d'insertion SQL ne mentionne pas l'ID. C'est pourquoi je pensais qu'il y aurait un moyen de travailler "sans" eux. – JayK