DataTable删除SQL Server中不反映的行
本文关键字:删除 SQL Server DataTable | 更新日期: 2023-09-27 17:51:03
我对c#相当陌生,这把我难住了。我的项目是使用数据表和TableAdapters连接到SQL Server数据库。我有一个方法,打开Excel,建立一个DataRow,然后通过TableAdapter (ctaJETS)将其添加到我的DataTable (cdtJETS)下面的方法。
public bool AddJETSRecord(DataRow JETSDataRow)
{
bool bolException = false;
cdtJETS.BeginLoadData();
// Add the data row to the table
try
{
cdtJETS.ImportRow(JETSDataRow);
}
catch (Exception e)
{
// Log an exception
bolException = true;
Console.WriteLine(e.Message);
}
cdtJETS.EndLoadData();
// If there were no errors and no exceptions, then accept the changes
if (!cdtJETS.HasErrors && !bolException)
{
ctaJETS.Update(cdtJETS);
return true;
}
else
return false;
}
上述工作良好,记录显示在SQL Server如预期的。我有另一种方法,在该数据表中捕获记录的子集,并将它们输出到另一个Excel文件(这是一个批处理过程,将收集记录随着时间的推移使用上述方法,然后偶尔输出它们,所以我不能直接将数据从第一个Excel文件移动到第二个)。在第二个Excel文件更新后,我想从表中删除记录,以便下次运行该方法时不会重复。这就是我遇到问题的地方:
public bool DeleteJETSRecords(DataTable JETSData)
{
int intCounter = 0;
DataRow drTarget;
// Parse all of the rows in the JETS Data that is to be deleted
foreach (DataRow drCurrent in JETSData.Rows)
{
// Search the database data table for the current row's OutputID
drTarget = cdtJETS.Rows.Find(drCurrent["OutputID"]);
// If the row is found, then delete it and increment the counter
if (drTarget != null)
{
cdtJETS.Rows.Remove(drTarget);
intCounter++;
}
}
// Continue if all of the rows were found and removed
if (JETSData.Rows.Count == intCounter && !cdtJETS.HasErrors)
{
cdtJETS.AcceptChanges();
try
{
ctaJETS.Update(dtJETS);
}
catch (Exception)
{
throw;
}
return true;
}
else
cdtJETS.RejectChanges();
return false;
}
当我通过该方法一步,我可以看到从数据表中删除的行(即,如果JETSData有10行,在结束cdtJETS有n-10行),没有抛出异常,但在我接受变化和更新TableAdapter之后,底层记录仍然在我的SQL Server表中。我错过了什么?
Rows.Remove
方法相当于调用该行的Delete
方法,然后调用该行的AcceptChanges
方法。
与DataTable.AcceptChanges
方法一样,这表明更改已经保存到数据库中。这不是你想要的。
下面的代码应该可以工作:
public bool DeleteJETSRecords(DataTable JETSData)
{
int intCounter = 0;
DataRow drTarget;
// Parse all of the rows in the JETS Data that is to be deleted
foreach (DataRow drCurrent in JETSData.Rows)
{
// Search the database data table for the current row's OutputID
drTarget = cdtJETS.Rows.Find(drCurrent["OutputID"]);
// If the row is found, then delete it and increment the counter
if (drTarget != null)
{
drTarget.Delete();
intCounter++;
}
}
// Continue if all of the rows were found and removed
if (JETSData.Rows.Count == intCounter && !cdtJETS.HasErrors)
{
// You have to call Update *before* AcceptChanges:
ctaJETS.Update(dtJETS);
cdtJETS.AcceptChanges();
return true;
}
cdtJETS.RejectChanges();
return false;
}