我正在处理e-commerce
应用程序,我在DB中有三个表
Order Details
有关单个产品的信息以及OrderId
是Order
的主键,我有2 Stored Procedures
从InsertIntoOrderAndCustomer
调用ADO.Net
时,它会在autoid
中生成OrderId
Order
,我需要将该ID用作{{1}的参数1}}但我担心如果放置多个订单,那么参数值可能是错误的。我可以锁定InsertIntoOrderDetails
代码,以便一次只能下一个订单吗?如果是,那怎么办?
我很担心
2人下订单
执行可能是,
人A下订单
C#
(当然只有一次)。平均而人B下订单
IDENTITY
(不同的)。然后在Orders表中使用AutoId IDENTITY
将数据插入product details
表。
插入IDENTITY
时,我使用product details
的{{1}}获取自动ID,这将给我101,如上面的情景。
第二次插入是否有可能使人B的MAX
SQL Server
(即101)和人IDENTITY
的其他数据?它让我担心。
答案 0 :(得分:1)
我认为混淆的可能性来自于“我使用{1}}的Sql Server获取自动ID”。
如果您从C#代码调用两个存储过程并独立调用它们,并且第二个sproc(MAX
)依赖InsertIntoOrderDetails
从MAX
获取最后一个自动生成的id,则是的,这需要在OrderDetails表中将用户A或B中的Id混淆。
我可以提出三种方法。可能还有其他人:
从Orders返回自动生成的id作为Orders
的Return或Output参数。 using InsertIntoOrderAndCustomer
在调用第二个sproc scope_identity()
时将其用作输入参数。 c#代码应该知道哪些客户和订单详细信息在上下文中。
让InsertIntoOrderDetails
sproc捕获自动生成的ID(使用InsertIntoOrderAndCustomer
,然后直接调用scope_identity
。
我不推荐这个,但是因为你问过。您的c#代码可以使用InsertIntoOrderDetails
来允许一次只调用一次过程代码。这是不可扩展的,如果在c#世界之外调用过程,它也不会禁止使用现有方法进行混合。