我有一个从多个表复制记录的按钮。它必须读取现有数据表,从查询中复制行,更改行中的一些信息,然后将新行写回同一个表。注意:它不变行但是创建具有类似信息的新行。 Code Bellow是我想要实现的一个例子。它将无法工作,因为它会在循环中向同一数据表中添加新行,直到堆栈溢出为止
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循环来计算行,但我不知道这是否可行。
答案 0 :(得分:0)
不要将整个表复制回数据库,因为不需要只使用查询或存储过程在数据库中插入新行。复制整个表将是一个性能问题,并且复制相同数据也没有意义只将新数据添加到数据库中。
答案 1 :(得分:0)
唯一的事我发现这是有效的 但感觉就像12点转!
很好的代码审查!
//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();