在使用MySQL的Windows窗体.net应用程序中,我的产品具有多个制造操作。每个操作都有一个预期的开始日期和预期的完成日期。我想做的是,当用户在第一个操作上更改日期时,为该产品的后续操作更改开始日期和结束日期(推送日期)。到目前为止,我已经设法更改了以下操作的日期,但是它们都是相同的。如果您可以通过一些代码帮助我,那将很棒。我应该改为使用数据表吗?到目前为止,这是我得到的:
#region Push the predicted start date in planning table for same product id if end date is pushed forward
DateTime oldStartDate = DateTime.Now;
DateTime oldFinishDate = DateTime.Now;
DateTime dt3 = DateTime.Parse(predicted_delivery.Text);
DateTime dt4 = DateTime.Parse(new_predicted_delivery.Text);
if(dt3.Date == dt4.Date)
{
return;
}
else
{
int delay = (dt4 - dt3).Days;
ConnectionStringSettings conSettings1 = ConfigurationManager.ConnectionStrings["shopmanagerConnectionString1"];
MySqlConnection con1 = new MySqlConnection(conSettings1.ToString());
MySqlCommand cmd1 = new MySqlCommand(@"select * from shopmanager.planning where part_id = @part_id;", con1);
MySqlDataReader myReader1;
try
{
con1.Open();
cmd1.Parameters.AddWithValue("@part_id", temp_part.item_id);
myReader1 = cmd1.ExecuteReader();
while (myReader1.Read())
{
oldStartDate = myReader1.GetDateTime("predicted_start_date");
oldFinishDate = myReader1.GetDateTime("predicted_delivery");
}
cmd1.Parameters.Clear();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
con1.Close();
newStartDate = oldStartDate.AddDays(delay);
newFinishDate = oldFinishDate.AddDays(delay);
UpdateNewStartDate();
}
#endregion
}
#endregion
#region Update new start and finish dates
private void UpdateNewStartDate()
{
ConnectionStringSettings conSettings = ConfigurationManager.ConnectionStrings["shopmanagerConnectionString1"];
MySqlConnection con = new MySqlConnection(conSettings.ToString());
MySqlCommand cmd = new MySqlCommand(@"update shopmanager.planning set predicted_start_date = @predicted_start_date, predicted_delivery = @predicted_delivery where part_id = @part_id", con);
try
{
con.Open();
cmd.Parameters.AddWithValue("@predicted_start_date", newStartDate);
cmd.Parameters.AddWithValue("@predicted_delivery", newFinishDate);
cmd.Parameters.AddWithValue("@part_id", temp_part.item_id);
cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
con.Close();
答案 0 :(得分:1)
该代码中发生了很多事情,但是我认为问题在于,您正在读取所有行,然后仅进行一次计算和一次更新。
如果您使用C#进行计算,则需要对每一行进行计算,如下所示:
while (myReader1.Read())
{
oldStartDate = myReader1.GetDateTime("predicted_start_date");
oldFinishDate = myReader1.GetDateTime("predicted_delivery");
newStartDate = oldStartDate.AddDays(delay);
newFinishDate = oldFinishDate.AddDays(delay);
UpdateNewStartDate(partId, newStartDate, newFinishDate);
}
cmd1.Parameters.Clear();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
con1.Close();
除了'UpdateNewStartDate();'更新所有行,因此您需要添加一个参数以指定要更新的行。
执行此操作的更好方法可能是在存储过程中执行此操作,因此您只需指定任务和延迟,它就会更新日期。
一般来说,它还有助于将数据库访问代码与业务逻辑分开,因此您的函数更小,更易于阅读。 UpdateNewStartDate实际上应该从参数中获取所有输入,而不使用与其他功能共享的变量-只是在您无法确定设置位置时会感到困惑。