防止双重预订ASP.NET C#

时间:2016-03-06 08:43:45

标签: asp.net gridview

我正在尝试使用SQL Server Express数据库在asp.net中创建一个度假计划器。

当您添加假期时,您必须添加begintimeendtime,当然还有您的身份。

有没有办法在已经和他们尝试添加的人一样的假期时显示错误。

这样系统可以防止双重休假。否则,Gridview表在两行中显示两个具有相同日期的相同名称。我想阻止人们双重预订。

我们假设A人已经预订了StartDate = 2016-03-06EndDate = 2016-03-10。比我想要阻止其他人在开始和结束日期之间预订相同的StartDateEndDate,甚至更早开始和结束日期之间的日期和日期,我的意思是例如2016-03之间-01和2016-03-06,2016-03-07,2016-03-08 ...因为这些日期在开始日期和结束日期之间。

我试图创建一个像下面这样的方法然后我不知道该怎么做。我将不胜感激任何帮助 // Noe编辑后插入按钮代替方法:

protected void btnInsertVacation_Click(object sender, EventArgs e)
        {


            string cs = ConfigurationManager.ConnectionStrings["ResursplaneringConnectionString"].ConnectionString;

            TextDateTime.Text = Calendar1.SelectedDate.ToShortDateString();

            using (SqlConnection con = new SqlConnection(cs))
            {

                string check = "SELECT EmployeeId, StartDate, EndDate FROM vacation WHERE (EmployeeId = @EmployeeId) AND(StartDate <= @NewEndDate) AND(EndDate >= @NewStartDate)";
                SqlCommand cmd = new SqlCommand(check, con);
                cmd.Parameters.AddWithValue("@EmployeeId", DropDownEmployee.SelectedValue);
                cmd.Parameters.AddWithValue("@NewEndDate", txtStartDate.Text);
                cmd.Parameters.AddWithValue("@NewStartDate", txtEnd.Text);
                con.Open();
                using (SqlDataReader rdr = cmd.ExecuteReader())
                {
                    while (rdr.Read())

                    {
                        if (rdr.HasRows)
                        {
                            Response.Write("Dubbel booking");
                        }

                        else

                        {
                            string insertVacation = "INSERT INTO Planering (StartDate, EndDate, EmployeeId ) VALUES (@StartDate, @EndDate, @EmployeeId)";
                            SqlCommand cmd2 = new SqlCommand(insertVacation, con);

                            SqlParameter paramPlaneringStart = new SqlParameter("@StartDate", txtStartDate.Text);
                            cmd2.Parameters.Add(paramPlaneringStart);

                            SqlParameter paramPlaneringEnd = new SqlParameter("@EndDate", txtEnd.Text);
                            cmd2.Parameters.Add(paramPlaneringEnd);

                            SqlParameter paramEmployeeId = new SqlParameter("@EmployeeId", DropDownEmployee.SelectedValue);
                            cmd2.Parameters.Add(paramEmployeeId);



                            con.Open();
                            cmd2.ExecuteNonQuery();

                        }


                    }
                }
            }
        }

1 个答案:

答案 0 :(得分:2)

为了清楚起见,让我们命名你的方法NewStartDate和NewEndDate的参数,以避免与我们将用于数据库表中的列的StartDate和EndDate混淆。

您希望在SQL查询中执行的操作是:

SELECT EmployeeId, StartDate, EndDate FROM vacation
WHERE
(EmployeeId = @EmployeeId)
AND (StartDate  <= @NewEndDate) AND (EndDate  >= @NewStartDate)

尝试在一张纸上绘制可能重叠的片段,您应该会看到这样做。

如果返回任何行,请勿允许创建新预订。