我的网站有一个设置,当应用程序启动时,一个名为SiteContent的模块被“创建”。这会运行一个clearup函数,它基本上会从数据库中删除任何不相关的数据,以防任何事件从以前运行的函数中遗留下来。
该模块具有Manager类的实例 - 即RangeManager,CollectionManager,DesignManager。还有其他人,但我会以这些为例。每个Manager类都包含一个项目数组 - 项目可以是Range,Collection或Design类型,无论哪个是相关的。然后将每个范围的数据读入Range,Collection或Design的实例。我知道这基本上是重复数据 - 不是非常有效,但它是我目前的最后一年项目,因此我可以随时更改它以使用Linq或类似的东西,当我没有受到一个月截止日期的压力。
我有一个表单,在单击“保存”按钮时,通过调用SiteContent.RangeManager.Create(vars)或SiteContent.RangeManager.Update(Range As Range,vars)(或其他管理器类的等效项,无论哪个)保存数据一个恰好是相关的。)
这些函数调用存储过程在相关表中插入或更新。
类范围,集合和设计都具有名称,描述,显示等几个属性。当调用Create或Update函数时,Manager循环遍历所有其他项以检查是否已存在具有相同名称的项。 Update函数确保它不会将正在更新的项目与其自身进行比较。如果找到另一个具有相同名称的项目,则抛出自定义异常(ItemAlreadyExistsException)。
出于一些奇怪的原因,如果我在编辑模式下进入范围,集合或设计,更改某些内容并尝试更新它,它偶尔不会更新该项目。当我偶尔说,我的意思是每3-4页加载,有时更多。我看到它何时或为何发生绝对没有模式。我有一个try-catch语句捕获ItemAlreadyExistsException,并在捕获时输出“具有此名称的项目”。偶尔它会输出这个;其他时候不会。
有谁知道为什么会发生这种情况?也许是某人之前犯过的错误?
我过去常常使用正则表达式来比较名称 - 我相信它是[a-zA-Z] {1,100}(1到100个小写或大写字符之间)。出于某种原因,我正在开发网站的客户过去常常会收到错误,说明格式不正确。然而,他可以在5分钟后尝试相同的文本,它会工作正常。我认为这可能是同样的问题,因为这两个问题都是随机发生的。
非常感谢提前。
此致
理查德克拉克编辑:经过大量时间缩小代码后,我决定等到我的兄弟,他已经比我的程序员多了至少8年,来到复活节后让他去看看在它。如果他无法解决问题,那么我会将文件压缩起来并放在某个地方供人们访问并进行操作。
我将其缩小到可能的最小文件数,但它仍然会发生。这似乎是每10次一次。话虽如此,我强制管理器类刷新每10页加载或5分钟(以较快者为准)。我可以调查一下 - 这可能会导致问题。基本上每个Manager都包含一个对象数组。使用数据库中的数据填充此数组。 Update函数获取项目的实例以及要为对象设置的新值。如果它恰好是重置数组的页面加载(即数据是从数据库中新加载的)那么具有相同ID的对象实例将不同于传入的对象实例。这解释了它的事实偶尔会抛出ItemAlreadyExistsException。这一切都有意义,我想的就越多。如果我要传递要更改的对象的ID,而不是对象本身,那么它应该完美地工作。如果我解决它,我会回答这个问题。
答案 0 :(得分:0)
哇哇似乎已经解决了这个问题。在调用按钮单击事件之前(我认为)在页面init事件中调用了刷新子。因此,正在重新创建/填充每个经理的项目。通过将子调用从init移动到loadcomplete,我设法解决了问题,似乎。
它仍然无法解决客户被告知他无法放置特定字符串然后稍后成功的问题..必须是一个不同的问题,因为刷新的东西最近才实现..但是至少有一个问题似乎已经解决了。
感谢您尝试帮助他们。
此致
理查德
答案 1 :(得分:0)
更多信息:我已在网站范围内实施了更改,发现它们无法正常工作(可能是我缺少一两处更改等等)并撤消了更改。然而,我很快就意识到“数据刷新”机制已经实施,因为我们只有两个应用程序同时在同一个数据库上运行,因为我们希望尽快让网站生效。自从上线日期以来,我设法将所有测试数据复制到实时数据库并交换实时站点以使用实时数据库,因此无需再刷新数据。
基本上因为数据被加载到类的实例中,它们都有效地创建了自己的数据源,直到应用程序被回收。这意味着它们暂时独立运行。在测试中有一些功能没有在实时和一些实时没有测试,所以要对一个需要仅测试和仅实时功能的项目进行一些更改,你必须在测试中进行更改,等到直播应用程序被回收,然后在现场进行任何必要的更改。这就是我决定创建10页刷新机制的原因 - 因此最多需要刷新10次才能使数据保持最新状态。它有点复杂,可以解释为什么它们都不是大致相同,但基本上测试有一个功能齐全但略显错误的管理前端和一个有缺陷的客户前端,而实时的所有客户前端错误都已修复,几乎没有任何功能在管理员前端,但是那里的几个位没有错误,并且还有一些额外的位。事实上我的笔记本电脑几个月前被盗了,所以,在没有备份代码的情况下,我不得不反编译测试网站并调试反编译代码,然后才能通过现场网站的功能进一步推进。当我试图反编译测试DLL并赶上实时站点时,客户仍希望使用测试版本来获得它所具有的功能,但是我希望我优先考虑测试站点中不存在的一些功能 - 因此我们不得不让他们都跑掉同一个数据库。我希望这可以解决任何人为什么会这么复杂的混乱。
总而言之,我通过完全删除刷新功能找到了解决问题的方法,这主要是因为实时和测试在相同的数据库上运行但具有非常不同的功能和不同数量的故障。这主要是因为必须赶紧让网站为上线日期做好准备,同时赶上我的笔记本电脑被盗并且不得不为测试网站反编译DLL。
此致
理查德