我正在尝试使用SQL Server Express数据库在asp.net中创建一个度假计划器。
当您添加假期时,您必须添加begintime
,endtime
,当然还有您的身份。
有没有办法在已经和他们尝试添加的人一样的假期时显示错误。
这样系统可以防止双重休假。否则,Gridview表在两行中显示两个具有相同日期的相同名称。我想阻止人们双重预订。
我们假设A人已经预订了StartDate = 2016-03-06
和EndDate = 2016-03-10
。比我想要阻止其他人在开始和结束日期之间预订相同的StartDate
,EndDate
,甚至更早开始和结束日期之间的日期和日期,我的意思是例如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();
}
}
}
}
}
答案 0 :(得分:2)
为了清楚起见,让我们命名你的方法NewStartDate和NewEndDate的参数,以避免与我们将用于数据库表中的列的StartDate和EndDate混淆。
您希望在SQL查询中执行的操作是:
SELECT EmployeeId, StartDate, EndDate FROM vacation
WHERE
(EmployeeId = @EmployeeId)
AND (StartDate <= @NewEndDate) AND (EndDate >= @NewStartDate)
尝试在一张纸上绘制可能重叠的片段,您应该会看到这样做。
如果返回任何行,请勿允许创建新预订。