ASP应用程序状态

时间:2011-12-16 14:08:13

标签: asp.net

我在事件Application_Start中的文件Global.asax代码:

{ 
   Application["orderId"]=0
}

然后我在按钮addOrder_click中的newOrder.aspx.cs中使用它来递增它,我在Visual Studio 2010中复制该项目的URL并将其粘贴到许多页面中以查看是否超过用户添加新订单。当我在我加载的第一个页面中尝试增加应用程序[“orderId”]时很好,但是当我打开另一个页面来表示另一个人时,数据库说:

“无法在对象'dbo.theOrder中插入重复键”

这意味着application [“orderId”]在零时再次初始化。 很抱歉很多行,我在解释问题时遇到了麻烦。

抱歉!帮我!谢谢!

2 个答案:

答案 0 :(得分:1)

每次重新启动应用程序时,您的订单ID都将重置为0.如果您使用此作为主键,则会发生冲突。

不是试图跟踪应用程序中的订单ID,而是使用自动增量字段,并在向数据库中插入新订单时返回值。

答案 1 :(得分:0)

应用程序是一个错误的地方,可以跟踪需要持久化并且永远不会重复的内容。应用程序池在任何数量的条件下重置和循环,每次发生时,orderid将返回到0。

有许多可能导致应用程序重置的内容 - 有关详细信息,请参阅此博客:http://blogs.msdn.com/b/johan/archive/2007/05/16/common-reasons-why-your-application-pool-may-unexpectedly-recycle.aspx

您应该让数据库管理订单ID。

而不是使用应用程序

如果orderId在数据库中,那么您应该将orderid列设置为Identity(自动递增列)并让数据库跟踪orderid。在插入新记录的地方,让DB处理它并检索新生成的orderId。

假设该表只有以下列(并进一步假设这是一个SQL Server):

OrderID int identy (Primary key)
OrderDate datetime
Customerid int (Foreign keym but known at order time)

你的插入语句如下所示:

Insert into Orders (OrderDate, Customerid) VALUES (GetDate(), @Customerid);Select @@SCOPE_IDENTITY as NewOrderId From Orders;

有关@@ Scope_Identity的更多信息,请参阅http://msdn.microsoft.com/en-us/library/ms190315.aspx