C# 数据集复制、更改,然后保存

C# 数据集复制、更改,然后保存,c#,datatable,C#,Datatable,我有一个按钮可以复制多个表中的记录。它必须读取现有的datatable,从查询中复制行,更改行中的某些信息,然后将新行写回同一个表。注意:它不是更改行,而是创建具有类似信息的新行。 下面的代码就是我想要实现的一个例子。它不会起作用,因为它会在循环中向同一个数据表添加新行,直到可能出现堆栈溢出 nexusDBDataSet.Drawing_Table.Clear(); drawing_TableTableAdapter.FillByJobNumber(nexusDBDataSet.Drawing_

我有一个按钮可以复制多个表中的记录。它必须读取现有的datatable,从查询中复制行,更改行中的某些信息,然后将新行写回同一个表。注意:它不是更改行,而是创建具有类似信息的新行。 下面的代码就是我想要实现的一个例子。它不会起作用,因为它会在循环中向同一个数据表添加新行,直到可能出现堆栈溢出

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'方法不接受它