Заявка за поръчка и 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 се променя и вече не съответства на външния ключ от таблицата с поръчки, след като изпълня тази заявка за втори път. така че какво трябва да направя, за да поправя това?


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