防止SQL双重预订

时间:2013-12-05 09:01:52

标签: c# sql sql-server

我正在尝试阻止预订系统中的双重预订,C#到SQL Server。

我正在使用存储过程并尝试过:

alter proc Datumkoll
    @DatumFrom smalldatetime = null,
    @datumTill smalldatetime = null
as
    select RumsNummer 
    from rum 
    where 
        RumsNummer not in (select rumsnummer 
                           from rumsbokning 
                           where datumfrån >= @datumfrom and datumtill <= @datumTill)

 GO

如果日期是在现有预订中设置的话,此代码不会阻止双重预订

3 个答案:

答案 0 :(得分:2)

说明时间窗口和选项:

非重叠:

[new]
         [existing]

部分重叠:

[new]                 [new]
  [existing]   [existing]

遏制:

    [new]       [-------new---------]
  [existing]         [existing]

您的支票仅处理最后一项;你需要回去考虑其他人。诀窍是实际上只需要3个测试:

  • 新的开始日期是现有预订
  • 新的结束日期在现有预订中
  • 现有预订完全在新预订

给了我们:

where (datumfrån>=@datumfrom and datumtill <= @datumTill)
or (@datumfrom >= datumfrån and @datumfrom <= datumtill)
or (@datumTill >= datumfrån and @datumfrom <= datumtill)

(另见替代结构的评论)

答案 1 :(得分:0)

select R.RumsNummer
from rum R
where not exists (
            select RB.rumsnummer
            from rumsbokning RB
            where 
                R.RumId = RB.RumId
                and RB.datumfrån >= @datumfrom 
                and RB.datumtill <= @datumTill )

无论如何,您应该在保存新预订时再次执行此检查。

答案 2 :(得分:0)

尝试

  Select rumsnummer 
   from rumsbokning 
   where datumfrån <= @datumTill and datumtill >= @datumfrom