我有一个用于医疗诊所的Windows窗体应用程序C#,秘书必须使用它来插入医生的病历。我要防止秘书在同一天插入与其他相同专业的医生相似的空缺职位。
1-我的数据库中有这些表:
2-我的窗户形式是:
3-我的代码是:
private void bt_addDisp_Click(object sender, EventArgs e)
{
int selectedDoctor = dgv_DispMed.CurrentRow.Index;
string prenomMed = dgv_DispMed.Rows[selectedDoctor].Cells[1].Value.ToString();
string nomMed = dgv_DispMed.Rows[selectedDoctor].Cells[2].Value.ToString();
if (MessageBox.Show("Do you realy want to add this disponibility for Dr "+prenomMed+" "+nomMed+" ?", "Confirm Add Disponibility", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{
string spec_id = dgv_DispMed.Rows[selectedDoctor].Cells[6].Value.ToString();
int jr = int.Parse(cmb_day.SelectedValue.ToString());
string Str_hdeb = cmb_startTime.Text.ToString();
string Str_hfin = cmb_endTime.Text.ToString();
string[] tab_hdeb = Str_hdeb.Split(':');
int hdeb = int.Parse(tab_hdeb[0]);
string[] tab_hfin = Str_hfin.Split(':');
int hfin = int.Parse(tab_hfin[0]);
MySqlConnection c1 = new MySqlConnection();
MySqlCommand cmd = new MySqlCommand();
c1.ConnectionString = "Database=growing_together;Data Source=localhost;User Id=root;password=;CHARSET=utf8;";
c1.Open();
string Q = "select count(*) as nb from medecin,disp_medecin,disponibilite where medecin_id=med_id and disp_id=disponibilite_id and speciality_id='" + spec_id + "' and jour=" + jr + " and "+ hdeb + " between heure_deb and heure_fin and " + hfin + " between heure_deb and heure_fin";
cmd = new MySqlCommand(Q, c1);
MySqlDataReader R = cmd.ExecuteReader();
int nb_disp = 0;
while (R.Read())
{
nb_disp = int.Parse(R.GetString("nb"));
}
c1.Close();
MessageBox.Show(nb_disp.ToString());
}
问题是 :
如果数据库中的可用性与秘书要插入的可用性相似,则查询返回1;否则返回0,表示秘书可以插入它。
例如,A医生和B医生都是心脏病(专长相同),
如果在周一的9:00至11:00有A医生,如果我尝试在同一时间,但在同一时间,但在同一时间,但又为同一专业的另一名医生提供类似的可用性,则查询返回1:
当我尝试从8:00到10:00或从10到12插入B医生的可用性时,查询返回0,这表示在此期间我可以插入新的责任,并且必须撤消该操作,因为如果我希望查询返回1,因为小时10:00在医生A的开始时间和结束时间之间,这意味着在这种情况下,同一专业的2位医生将在同一天,同一时间可用(10 :00)!
如何阻止呢?请帮忙。
最佳答案
让我们从负数开始。我可以在您的框架中看到很多问题,所以让我们涵盖主要问题:
为什么将DATETIME存储为一天(整数)和一个小时(整数)?仅仅将它们存储为DATETIME会更有效吗?一天(一天)什至代表什么,是每月的这一天(在这种情况下,您如何处理长度不同或,年的月份),或者是星期几(在这种情况下,您将如何预定机票)?提前一周以上预约)?
当您在不保护要添加的参数的情况下建立查询时,此代码易于进行SQL注入。是的,要添加的数据全部来自下拉列表,因此从理论上讲应该对其进行控制,但这仍然非常不安全;
如果您的SQL连接在方法中途掉线怎么办?我强烈建议添加一些基本的错误陷阱,还添加一些“使用”块,以允许所有这些对象(连接,命令对象,数据读取器)在发生故障时都可以正确处理;
您声明查询返回0表示没有冲突,或1表示存在冲突,但是事实并非如此。它实际上返回了COUNT个冲突,因此,如果您以某种方式允许冲突(例如,直接将一个冲突添加到数据库后端),则可能会返回2,然后可能无法正确处理?
您的SQL查询可以细分为以下内容(为清楚起见,我将其重新格式化):
SELECT
COUNT(*) AS nb
FROM
medecin m
disp_medecin dm ON dm.Med_id = m.medecin_id
disponibilite d ON d.disponibilite_id = dm.disp_id
WHERE
speciality_id = <spec_id>
AND jour = <jr>
AND <hdeb> BETWEEN heure_deb AND heure_fin
AND <hfin> BETWEEN heure_deb AND heure_fin;
我已经指出要在其中粘贴一个参数。
用英语写成这样:
找到谁的医生人数;
有要求的专业;
预订的日期与该医生的预约相符;
约会开始时间与该约会相交;
约会结束时间与此约会相交。
以您的示例为例,从9-11预定A医生,我们允许某人从8-10预定B医生,即使他与A医生具有相同的专长,因为约会开始时间与A医生的约会不相交(即使尽管结束时间确实如此)。
因此,我认为(牢记以上所有内容),解决方法只是更改此内容:
and jour=" + jr + " and "+ hdeb + " between heure_deb and heure_fin and " + hfin + " between heure_deb and heure_fin";
对此:
and jour= " + jr + " and ("+ hdeb + " between heure_deb and heure_fin OR " + hfin + " between heure_deb and heure_fin)";
因此,我们不是说开始和结束都必须与现有约会相交,而是要说如果预定的开始或结束时间与现有约会相交,那就不行了。
我在这里可能会偏离轨道,所以请告诉我这是否有帮助...
关于c# - 如何防止秘书使用sql查询插入与同一专业的其他医生相似的医生空缺?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43777477/