Set ObjRs = Connection.Execute(strSQL)
OrderId = ObjRs(0)
får då felmeddelandet:
ADODB.Recordset error '800a0cc1'
Item cannot be found in the collection corresponding to the requested name or ordinal.
/AddOrder.asp, line 65
rad 65 är:
OrderId = ObjRs(0)
LarsG eller någon annan, vad är det för fel? hur skall det se ut för att få transaktionen att fungera? det jag vill är att få redan på id:t som skapades vid inserten.
Det har inget med transaktioner att göra. Med din kod så kommer insert att returnera ett tomt recordset och det är det du får tillbaka vid execute. Resultatet av select-frågan kommer i ett annat recordset som du kan få tag på genom att göra
tack LarsG, funkade utmärkt med det sista alt.
nu har jag dock en annan fråga. kan man få in hela nedanstående kod i en transaktion så att ingen annan kan komma och göra inlägg emellan (även om sannolikheten att någon skulle göra det precis mellan två frågor är väldigt liten)
Om du vill sköta allt från ASP så är det nog bättre att använda metoderna begintrans/committrans istället. Din loop där du flyttar data mellan tabeller går att skriva som ett statement med insert ... select
Om man skulle göra om det till en stored procedure
create procedure percyFirst(
@orderNo int,
@customerId int,
@deliverySurname varchar(40),
@sessionId int,
@ip varchar(40))
as
declare @newId int,@errCode int
set nocount on
INSERT INTO OrderHead (OrderNo, CustomerId, DeliverySurname, Ip)
VALUES (@OrderNo,@CustomerId,@DeliverySurname ,@ip)
select @newid = @@identity,@errCode = @@error
if @errCode <> 0 goto panic
insert into OrderItem
SELECT Article.Price,
Temporder.ArticleId,
Temporder.Amount
FROM Article INNER JOIN Temporder
ON Temporder.ArticleId = Article.ArticleId
WHERE SessionId = @SessionId
select @errCode = @@error
if @errCode <> goto panic
DELETE FROM Temporder
WHERE SessionId = @SessionId
select 0,@newid
return
panic:
select @errCode,0
För att anropa en procedur så använder man kommandot
connect.begintrans()
set rs = connect.execute("execute percyFirst parameter,parameter2,...")
if rs(0) <> 0 then
connect.rollbacktrans()
else
connect.committrans()
end if
Tanken är att du får tillbaka ett recordset som innehåller dels en returkod och dels det nya räknarvärdet. Om returkoden <> 0 så får du göra rollback i ditt ASP program.