2010-09-14 8 views
0

Je suis actuellement en train d'utiliser un bouton pour insérer/mettre à jour du contenu dans une table. Il prend ensuite le fichier CSV téléchargé et l'insère ou le met à jour dans une table de données selon que la ligne existe ou non.C# Mise à jour des données Problème

Voici le code tiré après OnClick du bouton:

if (ExcelDDL.SelectedValue == "Time Points" && fileName == "TimePoints.csv") 
      { 
       var GetTPoints = (SEPTA_DS.TimePointsTBLDataTable)tpta.GetDataByCategory(CategoryDDL.SelectedItem.ToString()); 

       //Loop through each row and insert into database 
       int i = 0; 
       foreach (DataRow row in TempRouteDataTable.Rows) 
       { 
        //Gather column headers 
        var category = Convert.ToString(CategoryDDL.SelectedItem); 
        var agency = Convert.ToString(row["Agency"]); 
        if (agency == null || agency == "") 
        { 
         //If row is empty skip it entirely 
         goto skipped; 
        } 
        var route = Convert.ToString(row["Route"]); 
        var GetRShortName = (SEPTA_DS.RoutesTBLDataTable)rta.GetDataByRouteID(route); 
        var newRoute = ""; 
        if (GetRShortName.Rows.Count > 0) 
        { 
         newRoute = Convert.ToString(GetRShortName.Rows[0]["route_short_name"]); 
        } 

        var direction = Convert.ToString(row["Direction"]); 
        var serviceKey = Convert.ToString(row["Service Key"]); 
        var language = Convert.ToString(row["Language"]); 
        var stopID = Convert.ToString(row["Stop ID"]); 
        var stopName = Convert.ToString(row["Stop Name"]); 

        if (stopName.Contains("accessible")) 
        { 
         string[] noHTML = stopName.Split('>'); 
         int insertH = Convert.ToInt32(hta.InsertHandicapRow(newRoute,noHTML[2])); 
        } 
        var sequence = Convert.ToString(row["Sequence"]); 
        var origID = -1; 

        if (GetTPoints.Rows.Count > 0) 
        { 
         origID = Convert.ToInt32(GetTPoints.Rows[i]["TPointsID"]); 
         var GetID = (SEPTA_DS.TimePointsTBLDataTable)tpta.GetDataByID(origID); 
         if (GetID.Rows.Count < 1) 
         { 
          origID = -1; 
         } 
        } 

        if (origID == -1) 
        { 
         int insertData = Convert.ToInt32(tpta.InsertTimePoints(category, agency, newRoute, direction, serviceKey, language, stopID, stopName, sequence)); 
        } 
        else 
        { 
         int updateData = Convert.ToInt32(tpta.UpdateTimePoints(category, agency, newRoute, direction, serviceKey, language, stopID, stopName, sequence, origID)); 
        } 
        skipped: 
        i++; 
       } 
      } 

Vous pouvez voir comment je vérifie si vous souhaitez insérer ou mettre à jour autour du fond. J'utilise cette méthode dans d'autres sections de ce programme et cela fonctionne très bien. Mais dans ce cas, il déforme immensément ma base de données et je n'arrive pas à comprendre pourquoi.

Ceci est la partie inférieure de ma table après l'insertion [aucun élément actuellement au sein de la base de données]:

alt text

Ceci est la table après reuploading le CSV avec les données déjà existantes dans le tableau:

alt text

Je reçois également cette erreur lors de la mise à jour There is no row at position 2230. Qu'est-ce qui ne va pas dans le code pour provoquer thi s énorme changement? Je vérifie juste pour voir si l'identification existe et si elle met à jour plutôt qu'insérer.

La raison pour laquelle j'utilise goto est également parce qu'il y a des lignes vides dans le document qui doivent être ignorées.

+1

Sur le 'goto': il peut être facilement enlevé si vous voulez. Faites simplement un cycle normal pour, comme il se doit (il y a des phases d'initialisation et d'incrémentation claires, et je suppose que 'Rows' est indexable) et utilisez le mot-clé' continue' pour ignorer une itération. –

+1

ce serait aussi une bonne chose (tm) de changer cela: agency == null || agency == "" à ceci: string.IsNullOrEmpty (agence) si votre .net 4, vous pouvez utiliser string.IsNullOrWhitespace() –

+0

@ Maud'Dib Merci c'est beaucoup mieux. – balexander

Répondre

1

Votre colonne TPointsID est-elle un nombre généré automatiquement? Si tel est le cas, puisque vous ignorez la ligne vide, un problème d'intégrité référentielle peut se produire, à cause de données vides dans les lignes ignorées de la base de données.


De l'erreur: Il n'y a pas de ligne à la position 2230, il est entendu que, à cause de la vous sauter peut-être d'accéder à une ligne inexistante dans datatable.

De même, si possible, envisagez d'utiliser ADO.NET DataAdapter qui dispose de la fonctionnalité d'opération CRUD. Vous pouvez trouver plus à ce sujet à: http://support.microsoft.com/kb/308507

+0

Je saute une ligne dans le fichier téléchargé, pas dans la base de données. Cela annule-t-il votre première réponse? – balexander

+0

peut-être que cela pourrait. Mieux vaut essayer de construire une logique un peu plus fiable en utilisant la boucle for/foreach et essayer de supprimer l'instruction goto:. Puis au moins, vous pouvez savoir exactement ce qui se passe. Si cela ne résout toujours pas votre problème, essayez de mettre un try..catch autour de l'extrait de code ci-dessus et examinez la trace Inner Exception/Stack. –

+0

le 'goto' saute uniquement si le fichier téléchargé a une ligne vide et qu'il continue d'itérer. – balexander