Запрос заказа и OrderDetail

Таблица заказов

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 после того, как я выполню этот запрос во второй раз. так что я должен сделать, чтобы исправить это?


person user478636    schedule 15.04.2011    source источник
comment
Вы вызываете все от DECLARE до VALUES во второй раз? Или только 2-я вставка?   -  person taylonr    schedule 15.04.2011
comment
все от объявления до значений..... почему это неправильно? если я вызову его из вставки в значения... я получаю сообщение об ошибке, говорящее, что @OrderId не объявлен   -  person user478636    schedule 15.04.2011


Ответы (2)


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. Затем (такое же соединение или нет):

Вставьте детали заказа, используя:

-- конкатенация:

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

-- или Параметры:

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

INSERT INTO dbo.OrderDetail (OrderId,ProductDescriptionId,Quantity,UnitPrice)
VALUES (@OrderID,11,2,50000)
person manji    schedule 15.04.2011
comment
Вы уверены, что command.ExecuteScalar принимает 1 аргумент? Я получаю эту ошибку Нет перегрузки для метода ExecuteScalar занимает 1 - person user478636; 15.04.2011
comment
нет, конечно;) я исправил код (документ здесь msdn.microsoft.com/en-us/library/) - person manji; 15.04.2011

Если сведения о вашем заказе являются полем идентификации, то при вызове INSERT INTO dbo.OrderDetail он изменит SCOPE_IDENTITY. Вам нужно будет установить или @OrderID один раз для каждой записи Order и не вызывать SCOPE_IDENTITY снова, пока вы не добавите еще один столбец в свою таблицу Orders.

--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)
person taylonr    schedule 15.04.2011
comment
Это то, что я пытался сделать, просто выдает ошибку, вы должны объявить @OrderId. - person user478636; 15.04.2011