C# 数据集复制、更改,然后保存
我有一个按钮可以复制多个表中的记录。它必须读取现有的datatable,从查询中复制行,更改行中的某些信息,然后将新行写回同一个表。注意:它不是更改行,而是创建具有类似信息的新行。 下面的代码就是我想要实现的一个例子。它不会起作用,因为它会在循环中向同一个数据表添加新行,直到可能出现堆栈溢出C# 数据集复制、更改,然后保存,c#,datatable,C#,Datatable,我有一个按钮可以复制多个表中的记录。它必须读取现有的datatable,从查询中复制行,更改行中的某些信息,然后将新行写回同一个表。注意:它不是更改行,而是创建具有类似信息的新行。 下面的代码就是我想要实现的一个例子。它不会起作用,因为它会在循环中向同一个数据表添加新行,直到可能出现堆栈溢出 nexusDBDataSet.Drawing_Table.Clear(); drawing_TableTableAdapter.FillByJobNumber(nexusDBDataSet.Drawing_
nexusDBDataSet.Drawing_Table.Clear();
drawing_TableTableAdapter.FillByJobNumber(nexusDBDataSet.Drawing_Table, OldJobcardNumber);
//Process Line By Line
foreach (DataRow myRow in nexusDBDataSet.Drawing_Table.Rows)
{
//Read
string DirectoryName = myRow["DirectoryName"].ToString();
string DrawingName = myRow["DrawingName"].ToString();
string DateAdded = myRow["DateAdded"].ToString();
string LastAccessedDate = myRow["LastAccessedDate"].ToString();
string LastAccessedUserName = myRow["LastAccessedUserName"].ToString();
string ClientName = myRow["ClientName"].ToString();
string ContentType = myRow["ContentType"].ToString();
string Description = myRow["Description"].ToString();
//Add New
DataRow DrawingDataRow = nexusDBDataSet.Drawing_Table.NewRow(); // Multi Value
DrawingDataRow["JobNumber"] = NewJobcardNumber;
DrawingDataRow["DirectoryName"] = DirectoryName.Replace("\\" + OldJobcardNumber + "\\", "\\" + NewJobcardNumber + "\\");
DrawingDataRow["DrawingName"] = DrawingName;
DrawingDataRow["DateAdded"] = DateAdded;
DrawingDataRow["LastAccessedDate"] = LastAccessedDate;
DrawingDataRow["LastAccessedUserName"] = LastAccessedUserName;
DrawingDataRow["ClientName"] = ClientName;
DrawingDataRow["ContentType"] = ContentType;
DrawingDataRow["Description"] = Description;
nexusDBDataSet.Drawing_Table.Rows.Add(DrawingDataRow);
}
//Updating
this.Validate();
drawing_TableBindingSource.EndEdit();
tableAdapterManager.UpdateAll(nexusDBDataSet);
RefreshData();
我知道它们应该是两个循环,一个用于读取,一个用于写入,但我不知道如何将数据临时保存在某种数据表中以供以后写入,或者如何创建一个临时数据表来存储查询中的读取部分,然后将其写回实际的数据库,我曾考虑在写之前使用FOR循环来计算行数,但我不知道这是否可行 不要将整个表复制回数据库,因为它不需要使用查询或存储过程在数据库中插入新行。复制整个表将是一个性能问题,而且复制回相同的数据也没有意义,所以只向数据库添加新数据。我发现唯一有效的方法是 但这感觉像是一个12分的转弯 O很好地进行代码审查
//Create New Dataset
DataSet myDataSet = new DataSet();
DataTable myDataTable = myDataSet.Tables.Add("Temp");
myDataTable.Columns.Add("ID");
myDataTable.Columns.Add("JobNumber");
myDataTable.Columns.Add("DirectoryName");
myDataTable.Columns.Add("DrawingName");
myDataTable.Columns.Add("DateAdded");
myDataTable.Columns.Add("LastAccessedDate");
myDataTable.Columns.Add("LastAccessedUserName");
myDataTable.Columns.Add("ClientName");
myDataTable.Columns.Add("ContentType");
myDataTable.Columns.Add("Description");
//Read From Database
nexusDBDataSet.Drawing_Table.Clear();
drawing_TableTableAdapter.FillByJobNumber(nexusDBDataSet.Drawing_Table, OldJobcardNumber);
foreach (DataRow myRow in nexusDBDataSet.Drawing_Table.Rows)
{
//Read from database
string DirectoryName = myRow["DirectoryName"].ToString();
string DrawingName = myRow["DrawingName"].ToString();
string DateAdded = myRow["DateAdded"].ToString();
string LastAccessedDate = myRow["LastAccessedDate"].ToString();
string LastAccessedUserName = myRow["LastAccessedUserName"].ToString();
string ClientName = myRow["ClientName"].ToString();
string ContentType = myRow["ContentType"].ToString();
string Description = myRow["Description"].ToString();
//write to temp data table
DataRow DrawingDataRow = myDataTable.NewRow();
DrawingDataRow["JobNumber"] = NewJobcardNumber;
DrawingDataRow["DirectoryName"] = DirectoryName.Replace("\\" + OldJobcardNumber + "\\", "\\" + NewJobcardNumber + "\\");
DrawingDataRow["DrawingName"] = DrawingName;
DrawingDataRow["DateAdded"] = DateAdded;
DrawingDataRow["LastAccessedDate"] = LastAccessedDate;
DrawingDataRow["LastAccessedUserName"] = LastAccessedUserName;
DrawingDataRow["ClientName"] = ClientName;
DrawingDataRow["ContentType"] = ContentType;
DrawingDataRow["Description"] = Description;
myDataTable.Rows.Add(DrawingDataRow);
}
//Refresh DataBase
nexusDBDataSet.Drawing_Table.Clear();
drawing_TableTableAdapter.Fill(nexusDBDataSet.Drawing_Table);
foreach (DataRow myRow in myDataTable.Rows)
{
//read from temp data table
string JobNumber = myRow["JobNumber"].ToString();
string DirectoryName = myRow["DirectoryName"].ToString();
string DrawingName = myRow["DrawingName"].ToString();
string DateAdded = myRow["DateAdded"].ToString();
string LastAccessedDate = myRow["LastAccessedDate"].ToString();
string LastAccessedUserName = myRow["LastAccessedUserName"].ToString();
string ClientName = myRow["ClientName"].ToString();
string ContentType = myRow["ContentType"].ToString();
string Description = myRow["Description"].ToString();
//Write back to DataBase
DataRow DrawingDataRow = nexusDBDataSet.Drawing_Table.NewRow();
DrawingDataRow["JobNumber"] = JobNumber;
DrawingDataRow["DirectoryName"] = DirectoryName;
DrawingDataRow["DrawingName"] = DrawingName;
DrawingDataRow["DateAdded"] = DateAdded;
DrawingDataRow["LastAccessedDate"] = LastAccessedDate;
DrawingDataRow["LastAccessedUserName"] = LastAccessedUserName;
DrawingDataRow["ClientName"] = ClientName;
DrawingDataRow["ContentType"] = ContentType;
DrawingDataRow["Description"] = Description;
nexusDBDataSet.Drawing_Table.Rows.Add(DrawingDataRow);
}
myDataSet.Dispose();
//Updating
this.Validate();
drawing_TableBindingSource.EndEdit();
tableAdapterManager.UpdateAll(nexusDBDataSet);
RefreshData();
我不确定我是否理解,我试图从现有数据中生成新数据,并通过查询进行过滤。正如我所说,我不知道如何编写临时数据表来存储新数据,我尝试了“DataSet myDataSet=NEW DataSetTemp;DataTable myDataTable=新DataTableTemp;'但是'drawing_TableAdapter.FillByJobNumber'方法不接受它