2010-09-14 100 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