2010-09-14 91 views
0

我目前使用一個按鈕來在表中插入/更新內容。然後它取得上傳的CSV並根據行是否存在將其插入或更新到數據表中。C#更新數據問題

這裏是按鈕的OnClick後被解僱代碼:

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++; 
       } 
      } 

你可以看到我是如何檢查是否插入或周圍的底部更新。我在這個程序的其他部分使用這種方法,它工作得很好。但在這種情況下,它極大地扭曲了我的數據表,我無法弄清楚爲什麼。

這是我的表[數據庫中目前沒有任何項目]插入後底部:

alt text

這與表中已有的數據重新上傳的CSV後的表:

alt text

更新There is no row at position 2230. 當什麼在代碼中腳麻造成THI我也收到此錯誤巨大的轉變?我只是檢查該ID是否存在以及是否更新而不是插入。

此外,我使用goto的原因是因爲文檔中有空行需要跳過。

+1

在「goto」上:如果您願意,可以輕鬆刪除它。只要定期執行'for'循環(應該是這樣)(有明確的初始化和遞增階段,我猜'Rows'是可索引的)並使用'continue'關鍵字來跳過迭代。 – 2010-09-14 16:46:10

+1

這也將是一件好事(tm)來改變這一點:代理機構== null ||如果你的.net 4,你可以使用string.IsNullOrWhitespace() – 2010-09-14 18:06:30

+0

@ Maud'Dib謝謝你,這是好得多。 – balexander 2010-09-14 18:08:21

回答

1

您的TPointsID列是自動生成的數字嗎?如果是這樣,由於您跳過空行,可能會出現一些參照完整性問題,因爲數據庫中跳過的行中有空數據。


從錯誤:沒有排在2230位,還可以理解的是,由於跳過你可能會試圖訪問DataTable中的一些不存在的行。

另外,如果可能的話,考慮使用具有CRUD操作功能的ADO.NET DataAdapter。您可以在以下網址找到更多相關信息:http://support.microsoft.com/kb/308507

+0

我在上傳的文件中跳過一行,而不是在數據庫中。這是否使您的第一個迴應無效? – balexander 2010-09-14 17:01:30

+0

也許可以。最好嘗試使用for/foreach循環來構建一個更可靠的邏輯,並嘗試刪除goto:語句。至少你可以確切地知道發生了什麼。如果仍然不能解決您的問題,請嘗試在上面的代碼片段中嘗試一下try..catch,然後檢查Inner Exception/Stack跟蹤。 – 2010-09-14 17:06:06

+0

如果上傳的文件有一個空行並且它仍在迭代,那麼'goto'只會跳過。 – balexander 2010-09-14 17:19:14