如何防止参数再次使用?

时间:2013-01-30 08:53:05

标签: c# .net unique

在这个答案之后:

Why are these hashcodes equals?

我意识到GetHashCode打算不为对象提供唯一标识符。

这个测试的目的是我有一个带有6个参数的业务功能:

  • customerId
  • serviceId
  • startDate
  • EndDate
  • cmsThematicId

我不希望能够使用相同的值多次调用此函数

这些参数被插入到数据库中,我可以使用(customerId = @customerIdserviceId = @serviceId ...查询),但我需要通过大量组合来提高效率,因此这不是一个解决方案。

编辑:

示例:

假设我有一个超级用户需要注册客户。注册由5个参数组成:customerId,serviceId,startDate,EndDate,cmsThematicId。注册过程如下:

  • 您选择服务(例如“用红色大按钮显示”)
  • 您选择了客户(谁购买了该服务)
  • 选择cmsThematicId(如果需要,可以选择网页)
  • 您选择startDate(在下拉列表中)
  • 选择endDate(在下拉列表中)

我的表单无法显示已使用的一组参数。

例如,一旦客户1在1月份的“纽约假期”页面上注册了服务“大红色按钮”,超级用户将不会在表单中看到这些参数集。

所以我的过程就这样做了: - 创造所有可能性 - 计算列表中每种可能性的哈希码 - 获取每个已使用的可能性的哈希码(来自数据库) - 从列表中删除已使用的可能性 - 显示表格

问题是:hashcode不是唯一的,所以我可能会删除一个项目,即使它没有被使用。

更清楚吗?

1 个答案:

答案 0 :(得分:0)

每次调用后,将6个值存储在具有组合索引的历史记录表中。 在您的业务功能中,我将添加一个代码来验证这些值是否已经在您的历史记录表中,并在我找到这些值时立即退出。

稍后编辑: 这是您应该如何查询历史记录表:

IF EXISTS
  (SELECT customerId FROM HIstory WITH (NOLOCK) WHERE customerId='<value>' AND serviceId='<value>' AND <add all your fields here>)
    SELECT 1
ELSE
    SELECT 0

这样,如果已有记录(意味着您的业务功能已经使用您正在测试的参数调用),则上述查询返回1,否则返回0。

所以,如果是1,你需要停止。

如果为0,则需要将值添加到历史记录表并执行业务逻辑。或者:执行业务逻辑然后将值添加到历史表中。

<强> EDIT2: 最初,您的历史记录表为空。每次调用您的函数都将:

  1. 在Hitory表中查询与作为参数传递给函数的值匹配的现有值

  2. 如果需要,请填充历史记录表。

  3. 也就是说,您的函数首先要查询History表和(如果需要)在该表中插入一组新值。 基本上,每次调用您实现的函数时都会执行查询,因为查询是在该函数内完成的。