#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.