我有两张桌子。一个名为* tbl_workers *,其他名称为* tbl_attendance *。 在* tbl_worker *中,我记录了工人的工资。 在* tbl_attendance *中,我记录了他在特定日期所做的加班时间。 现在,我想要的是首先为工人生成每小时工资。 将工资除以31,然后将结果除以9,因为9小时是办公室的正常工作日。 通过这样做,我掌握了工人的每小时费率。 现在,我想要的是将* tbl_attendence *的每一行(OT是列的名称)乘以工人的每小时费率,并将其存储在名为* overtime_rate *的另一列中。到目前为止我所做的是:
SqlConnection con = new SqlConnection(@"Data Source=TIMBERTRENDZ-PC\NEWSERVER;Initial Catalog=trendz;user id=sa;Password=Letmein3#;Trusted_connection=False");
con.Open();
SqlCommand cmd = new SqlCommand("Select worker_salary from tbl_workers where worker_id='"+textBox1.Text +"'",con);
int salary = (int)cmd.ExecuteScalar();
salary = salary/31;
salary = salary / 9;
label1.Text = Convert.ToString(salary);
SqlCommand cmd1 = new SqlCommand("Select ot from tbl_attendence where worker_id='"+textBox1.Text + "'",con);
int ot = (int)cmd1.ExecuteScalar();
ot = ot / 60;
salary = salary * ot;
SqlCommand cmd2 = new SqlCommand("update tbl_attendence set overtime_rate='"+salary +"' where worker_id='"+textBox1+ "'",con);
/**int i = cmd2.ExecuteNonQuery();
label2.Text = Convert.ToString(i);
**/
但这是在与工作人员ID匹配的所有列中存储相同数量。
答案 0 :(得分:1)
好的我需要一个解释,首先为什么你在使用ADO.Net时这样做可以在数据库中作为单个更新完成,其次有一个原因你需要保存在数据库中的值,因为这打开了你自己当员工薪资发生变化时,数据变得不同步,您需要确保加班值也会更新。
Select ((worker_salary / 31) / 9) * (ot / 60)
from tbl_attendence as a
inner join tbl_workers as w on w.worker_id = a.worker_id
where worker_id=
此查询将根据您上面的计算得出您的OT费率。然后,要更新tbl_attendance表中的overtime_rate字段,您可以运行
update tbl_attendence set overtime_rate=
Select ((worker_salary / 31) / 9) * (ot / 60) )
from tbl_attendence as a
inner join tbl_workers as w on w.worker_id = a.worker_id
这将为您更新所有工人的加班费率。不需要使用C#,ADO,它只是让SQL Server完成它的工作。在运行它之前验证SQL,因为我自由键入它而没有检查括号等。
希望这有帮助。
杰森
编辑:
为了帮助您了解此查询的工作原理,我确保在列名称中包含表名。只要两个表中都不存在列,查询就会起作用。
update tbl_attendence set overtime_rate=
Select ((w.worker_salary / 31) / 9) * (a.ot / 60) )
from tbl_attendence as a
inner join tbl_workers as w on w.worker_id = a.worker_id