Запрос заказа и детализация заказа

#asp.net #sql #database #ado.net #shopping-cart

#asp.net #sql #База данных #ado.net #корзина для покупок

Вопрос:

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

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

Комментарии:

1. Вы вызываете все, начиная с ОБЪЯВЛЕНИЯ и заканчивая ЗНАЧЕНИЯМИ, во второй раз? Или только вторая вставка?

2. все, от объявления до значений ….. почему это неправильно? если я вызываю его из inset в values .. я получаю сообщение об ошибке, в котором говорится, что @OrderID не объявлен

Ответ №1:

I. Вы должны использовать то же самое соединение, чтобы:

Вставьте заказ:

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

Извлеките SCOPE_IDENTITY() и сохраните его в каком-нибудь месте вашего кода (вы не указали .ЧИСТЫЙ код, чтобы я мог дать вам более точный совет) :

 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)
  

Комментарии:

1. вы уверены в команде. ExecuteScalar принимает 1 аргумент? Я получаю эту ошибку, никакая перегрузка для метода ‘ExecuteScalar’ не занимает 1

2. нет, конечно 😉 я исправил код (документ здесь msdn.microsoft.com/en-us/library /… )

Ответ №2:

Если ваш заказ детализирован как поле идентификации, то при вызове INSERT В dbo.OrderDetail это приведет к изменению SCOPE_IDENTITY. Вам нужно будет установить or @OrderID один раз для каждой записи заказа и не вызывать 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)
  

Комментарии:

1. Это то, что я пытался сделать, просто это выдает ошибку, вы должны объявить @OrderID.