2016-12-28 3 views
0

Я следующие базы данных (Примечание: Даты в формате дд-мм-гггг)Проверьте запись существует

autoID name  initialdate finaldate 

1 john  01-01-2016  05-01-2016 
2 michael  01-02-2016  05-02-2016 
3 andrew  01-01-2016  10-01-2016 
...... 

пользователь вставит, с помощью простой формы HTML, новый пользователь, пример

4 michael  01-03-2016  02-03-2016 

Что возвращает OK, потому что даты не пересекаются.

Однако, мне нужно, что если они представляют один из этих двух примеров, сообщение об ошибке показывает, и не добавляет запись:

4 michael  04-02-2016  10-02-2016  (note it starts on 04-02, which overlaps a record that already exists 

или

4 michael  20-01-2016  02-02-2016  (same) 

или

4 michael  02-02-2016  04-02-2016 

или

4 michael  01-01-2016  20-02-2016 

и так далее.

Как это сделать, используя ASP.net и базу данных .mdb (access)?

+0

, в то время как вы вставляете новую запись, проверьте минимальную дату для начальной даты и максимальную дату для даты окончания для имени, а затем посмотрите, находится ли новая запись в этом диапазоне. В основном вам нужно будет добавить подтверждение перед добавлением записи. – Gautam

+0

Создайте функцию, которая проверит, есть ли запись для данного имени, используйте ее, чтобы проверить, нужно ли запускать запрос на ввод или нет. – Velid

+0

@Gautam - да, я знаю, но я не могу найти логику для этой проверки ... Это моя проблема. Velid - извините, не тот случай - данное имя может быть много разным. –

ответ

-1

Я бы запросил запрос для соответствующих записей. Предположим, что ваша новая запись введена в текстовые поля с именем txtName, txtInitialDate и txtFinalDate. Таким образом, ваш запрос будет выглядеть следующим образом:

SELECT * 
FROM MyTable 
WHERE Name = '" & Me.txtName & "' 
    AND (InitialDate BETWEEN #" & Me.txtInitialDate & "# AND #" & Me.txtFinalDate & "# 
    OR FinalDate BETWEEN #" & Me.txtInitialDate & "# AND #" & Me.txtFinalDate & "#) 

Это должно дать вам все записи, где совпадает с именем, и любой из дат, введенных между InitialDate и FinalDate. Если ваши даты введены между этими двумя датами, у вас есть перекрытие.

Теперь все, что вам нужно сделать, это подсчитать количество строк в этом запросе. Если RowCount> 0, это запись, которая перекрывается. Если RowCount = 0, перекрытия нет.

+0

У вашего предложения есть несколько проблем: 1) если вас просто интересует количество строк, удовлетворяющих критериям, используйте '' SELECT COUNT (*) '' вместо того, чтобы извлекать все эти строки; 2) сборка операторов SQL в виде строк с использованием пользовательского ввода подвержена атакам SQL-инъекций; вместо этого используйте параметры SQL, чтобы смягчить это. – uncoder

+0

Есть риск SQL-инъекции в MSAccess ?? –

+0

Если значения вводятся конечным пользователем, то да, абсолютно. – uncoder

0

Мне удалось найти много логической помощи от вас. То, что я пришел:

Set Conn = Server.CreateObject("ADODB.Connection") 
Conn.Provider="Microsoft.Jet.OLEDB.4.0" 
Conn.Open Server.MapPath("My_DB.mdb") 
Set reg = Server.CreateObject("ADODB.Recordset") 
checkit = "SELECT COUNT (*) as cnt FROM dados WHERE name = '" & TXTName & "' AND (dateinit <= " & TXTdateend & " AND " & TXTdateinit & " <= dateend)" 
reg.Open checkit, Conn 
if check <> 0 then 
'code to use if dates overlap' 
else 
'code if dont' 
end if 

Я не знаю, если это правильно сделать так, но это не то, что мне действительно нужно. Благодаря!

+0

"SELECT COUNT (*) as cnt FROM dados WHERE name = '" & TXTName & "' AND ((dateinit <=" & TXTdateend & "AND" & TXTdateinit & "<= dateend) или (dateinit <=" & TXTdateinit & "AND" & TXTdateend & "<= dateend) или (dateinit> =" & TXTdateend & "AND" & TXTdateend & "<= dateend) или (dateinit> =" & TXTdateinit & "AND" & TXTdateinit & "<= dateend)) «вы должны все эти условия также, поскольку эти условия также сливаются с существующим диапазоном дат. Вот что я думаю. Посмотрите, если это соответствует вашим требованиям. – Gautam

+0

@Guatam спасибо! Но, к сожалению, я не понял вашу логику. Зачем мне проходить эти дополнительные проверки? Msgstr "Слияние с существующим диапазоном дат"? Не понял .. –

+0

(dateinit <= "& TXTdateend &" AND "& TXTdateinit &" <= dateend) Для новой даты с любым предыдущим интервалом. или (dateinit <= "& TXTdateinit &" AND "& TXTdateend &" <= dateend) for Для предыдущего интервала приходится с новым интервалом или (dateinit> = "& TXTdateend &" AND "& TXTdateend &" <= dateend), когда новый интервал даты начинается до предыдущего интервала, но падает в интервале или заканчивается в предыдущем интервале или (dateinit> = "& TXTdateinit &" AND "& TXTdateinit &" <= dateend), когда новый интервал начинается с предыдущего интервала и заканчивается после окончания предыдущего интервал. Перекрытие во всех случаях. – Gautam

Смежные вопросы