DataTable中Rows.RemoveAt(i)和Rows(i).Delete的区别

DataTable操作技巧
本文详细解析了在.NET中操作DataTable的两种方法:使用Delete方法仅更改行状态而不立即从表中移除,以及使用RemoveAt方法直接从DataTable中删除行。阐述了在不同场景下选择合适方法的重要性,特别是在循环删除时应采用倒序遍历以避免索引错误。
//delete并不是真的删除 只是 将该row的rowstate变为 rowstate.delete(Rows.Count还是那么多)
//remove是 真的从datatable中删除

比如:

ds.Tables[0].Rows[i].Delete();
ds.Tables[0].Rows.RemoveAt(i);

两者是有区别的. 
1. 使用myDataTable.Rows.RemoveAt(i)删除行.
2. 使用myDataTable.Rows(i).delete 这时候需要使用 myDataTable.AcceptChanges 才能更新到数据库.

两种方法看似第一种比较简单.但不要在循环里使用myDataTable.Rows.RemoveAt(i).因为每删除一行后.i的值会增加,但行数会是减少了.这么做一定会出错.
因此要遍历数据,使用Remove方式时,要倒序的遍历
int count = ds.Tables[0].Rows.Count;
for (int i = count -1; i >=0; i--)
{
ds.Tables[0].Rows.RemoveAt(i);
}
代码分析: private void RMImport(DataTable dt) { this.Cursor = Cursors.WaitCursor; string histmon = Convert.ToString(dt.Rows[1][1]).Replace("-", "").Substring(0, 6); #region Stocked //删除所传数据月份数据 string sql_del = @" DELETE FROM icost_detail_obms_rm_stock WHERE histmonth = '" + histmon + @"' "; DataTool.ExecuteSql(sql_del); DataTable dt_stock = new DataTable(); dt_stock = dt.Clone(); foreach (DataRow dr in dt.Rows) { if (Convert.ToString(dr[0]).Contains("Non-stocked")) { break; } dt_stock.ImportRow(dr); } // 确保至少有6行 if (dt_stock.Rows.Count >= 6) { // 获取列名--第六行的值 DataRow row6 = dt_stock.Rows[5]; for (int i = 0; i < dt_stock.Columns.Count; i++) { dt_stock.Columns[i].ColumnName = row6[i].ToString().Replace("/", "").Replace(" ", "").Replace(".", "").Trim().ToUpper(); } // 删除前五行(多余行) for (int i = 0; i < 6; i++) { dt_stock.Rows.RemoveAt(0); } } //检查是否有空行 DataRow[] delrows = dt_stock.Select("costcenter = '' OR costcenter IS NULL"); foreach (DataRow row in delrows) { dt_stock.Rows.Remove(row); } dt_stock.Columns.Add("GRADE1"); dt_stock.Columns.Add("HISTMONTH"); foreach (DataRow dr in dt_stock.Rows) { dr["GRADE1"] = "Fab1"; dr["HISTMONTH"] = histmon; } int j = 0; if (dt_stock != null) { j = DataTool.BulkInsert("icost_detail_obms_rm_stock", dt_stock); } #endregion #region Non-Stocked //删除所传数据月份数据 string sql_del1 = @" DELETE FROM icost_detail_obms_rm_non_stock WHERE histmonth = '" + histmon + @"' "; DataTool.ExecuteSql(sql_del1); dt.Columns[0].ColumnName = "fab"; DataTable dt_nonstock = new DataTable(); dt_nonstock = dt.Copy(); dt_nonstock.DefaultView.RowFilter = "fab in('Plant','PT01')";//plant为后续要获取的列名行;PT01固定不变 dt_nonstock = dt_nonstock.DefaultView.ToTable(); // 确保至少有1行 if (dt_nonstock.Rows.Count >= 1) { List<string> emptycol = new List<string>(); // 获取列名--第一行的值 DataRow row1 = dt_nonstock.Rows[0]; for (int i = 0; i < dt_nonstock.Columns.Count; i++) { if (!string.IsNullOrEmpty(Convert.ToString(row1[i]))) { if (Convert.ToString(row1[i]).ToUpper() == "USER")//需特殊处理的列名 与数据库中保持一致 { dt_nonstock.Columns[i].ColumnName = "USERID"; } else { dt_nonstock.Columns[i].ColumnName = row1[i].ToString().Replace("/", "").Replace(" ", "").Replace(".", "").Trim().ToUpper(); } } else { emptycol.Add(dt_nonstock.Columns[i].Caption); } } // 删除多余列 否则影响BulkInsert for (int i = 0; i < emptycol.Count; i++) { dt_nonstock.Columns.Remove(emptycol[i]); } // 删除第一行(多余行) for (int i = 0; i < 1; i++) { dt_nonstock.Rows.RemoveAt(0); } } //检查是否有空行 DataRow[] delrows1 = dt_nonstock.Select("plant = '' OR plant IS NULL"); foreach (DataRow row in delrows1) { dt_nonstock.Rows.Remove(row); } dt_nonstock.Columns.Add("GRADE1"); dt_nonstock.Columns.Add("HISTMONTH"); foreach (DataRow dr in dt_nonstock.Rows) { dr["GRADE1"] = "Fab1"; dr["HISTMONTH"] = histmon; } int y = 0; if (dt_nonstock != null) { y = DataTool.BulkInsert("icost_detail_obms_rm_non_stock", dt_nonstock); } #endregion if (j > 0 && y > 0) { DevExpress.XtraEditors.XtraMessageBox.Show("RM相关数据保存成功"); } else { if (j > 0 && y == 0) { DevExpress.XtraEditors.XtraMessageBox.Show("Non-Stocked部分保存失败!请联系开发人员"); } else if (j == 0 && y > 0) { DevExpress.XtraEditors.XtraMessageBox.Show("Stocked部分保存失败!请联系开发人员"); } else { DevExpress.XtraEditors.XtraMessageBox.Show("RM相关数据保存失败!请联系开发人员"); } } this.Cursor = Cursors.Default; }
最新发布
08-30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值