2010-07-27 3 views
0

Je dois ouvrir une connexion à la base de données SQL et lire un sous-ensemble d'une table et soit mettre à jour un enregistrement si existe ou insérer si non trouvé. Ayant truoble mise à jourQuestion sur la mise à jour/insertion d'une datatable dans un ensemble de données

SqlConnection conn = new SqlConnection(ConnectionStrings.PgenIntranet.SqlClientConnectionString); 
         SqlDataAdapter indicators = new SqlDataAdapter(); 
         string sql = "SELECT * FROM BusinessApplications.tbl_WPI_Site_Indicators where Year = '" + year + 
      "' and Month = '" + month + "' and PlantId = " + site.ID; 

    indicators.SelectCommand = new SqlCommand(sql, conn); 
    SqlCommandBuilder cb = new SqlCommandBuilder(indicators); 
    indicators.UpdateCommand = cb.GetUpdateCommand(); 
    DataSet ds = new DataSet(); 
    indicators.Fill(ds, "indtable"); 
    DataTable indtable = ds.Tables["indtable"]; 
    // this logic not working 
     if (indtable.Rows.Count == 0) { indtable.NewRow(); } 
     DataRow dr = indtable.NewRow(); 

    /// not sure how to make this work 
     indtable[1]["PlantId"] = site.ID; 
     dr["PlantId"] = site.ID; 

Répondre

0

Il a été un moment que je l'ai utilisé DataSet/DataTable/DataRows, mais je pense que vous êtes proche. Si je me souviens bien, vous devez créer un nouvel objet de ligne comme vous le faites ici:

DataRow dr = indtable.NewRow(); 

puis remplir cette ligne avec vos données, aussi semblable à la façon dont vous le faites:

dr["PlantId"] = site.ID; 

Puis finalement ajouter cette ligne à la collection de lignes dans le DataTable. (Vous voudrez vérifier si votre instance de DataTable est réellement le DataTable dans la collection de tables sur le DataSet, je ne me rappelle pas les détails. Il peut être plus sûr de référencer directement la collection de Tables plutôt que de la mettre dans son propre objet.)

Notez que ceci ne pas ajouter la ligne à la base de données. Il l'ajoute simplement à l'instance DataTable. Vous devrez mettre à jour la base de données en conséquence. Et cette configuration que vous avez ici est un peu ... désordonnée ... donc je n'ai pas de réponse rapide pour ça. Puisque vous n'utilisez que du vieux ADO, je suppose que vous devrez créer une commande de mise à jour et la remplir et l'exécuter en conséquence.

Ce faisant, s'il vous plaît prendre soin de corriger les vulnérabilités d'injection SQL comme celui que vous avez là :)

+0

Je ne suis pas lié à cette vieille ADO, avez-vous une suggestion? – BillTetrault

+0

@Bill NHibernate & Entity Framework sont deux ORM qui sont très populaires et ont eu beaucoup de publicité. Voir http://stackoverflow.com/questions/3251849/please-recommend-net-orm-for-n-tier-development –

0

Ne pas oublier d'ajouter votre nouvelle ligne à la table, puis appelez la mise à jour ...

indtable.Rows.Add(dr); 
ds.Update(); 
Questions connexes