订单查询和OrderDetail

时间:2011-04-15 12:09:06

标签: asp.net sql database ado.net shopping-cart

订购表

OrderId
CustomerId
Date
Total

订单明细

OrderDetailId
OrderId
ProductId
Quantity
UnitPrice

我正在使用订单查询

INSERT INTO dbo.Orders (CustomerId, Date, Total)
VALUES (1, 2011-04-10, 50000);

我多次执行OrderDetail查询。

DECLARE @OrderID int
SET @OrderID = SCOPE_IDENTITY()

INSERT INTO dbo.OrderDetail (OrderId,ProductDescriptionId,Quantity,UnitPrice)
VALUES (@OrderID,11,2,50000)

这里的问题是@OrderID的值发生了变化,并且在我第二次执行此查询后不再匹配Orders表中的外键。那我该怎么做才能解决这个问题?

2 个答案:

答案 0 :(得分:1)

I.您必须使用 相同的连接 来:

插入订单:

INSERT INTO dbo.Orders (CustomerId, Date, Total)
VALUES (1, 2011-04-10, 50000);

检索SCOPE_IDENTITY()并将其存储在代码中的某个位置(您没有提供.NET代码,因此我可以为您提供更精确的建议):

command.CommandText = "SELECT SCOPE_IDENTITY()";
int lastOrderId = (int)command.ExecuteScalar();

II.然后(相同与否):

使用以下方法插入OrderDetails:

- 连接:

"INSERT INTO dbo.OrderDetail (OrderId,ProductDescriptionId,Quantity,UnitPrice)
 VALUES ('" + lastOrderId.ToString() + "',11,2,50000)"

- 或Parameters

command.Parameters.Add("@OrderID", SqlDbType.Int);
command.Parameters("@OrderID").Value = lastOrderId;

INSERT INTO dbo.OrderDetail (OrderId,ProductDescriptionId,Quantity,UnitPrice)
VALUES (@OrderID,11,2,50000)

答案 1 :(得分:1)

如果您的订单详细信息作为标识字段,那么当您调用INSERT INTO dbo.OrderDetail时,它将更改SCOPE_IDENTITY。您需要为每个订单条目设置一次或@OrderID,并且在您向Orders表中添加另一列之前不要再次调用SCOPE_IDENTITY。

--Run this once per order
INSERT INTO dbo.Orders (CustomerId, Date, Total)
VALUES (1, 2011-04-10, 50000);

--Run this once per order
DECLARE @OrderID int
SET @OrderID = SCOPE_IDENTITY()

--Run this once per orderdetail
INSERT INTO dbo.OrderDetail (OrderId,ProductDescriptionId,Quantity,UnitPrice)
VALUES (@OrderID,11,2,50000)