04. august 2003 - 22:37Der er
19 kommentarer og 2 løsninger
SP virker ved QA men ikke fra ASP!?
Denne her har jeg siddet og rodet med et langt stykke tid nu.
Det er en ellers velfungerende Stored Procedure, som volder problemer. Hvis jeg kalder denne SP fra Query Analyzer, virker det. Hvis jeg kalder fra en ASP side giver det fejl. Det er med samme bruger, og med samme parametre.
Her er min SP:
----------------------------- CREATE PROCEDURE fight_ms_dropitem @mnum int, @mid2 int, @membername nvarchar(50) AS set nocount on
--starting the sequence that makes a m drop an item-- DECLARE @RN DECIMAL(5,2) SET @RN = Rand()*100 DECLARE @drop_chance DECIMAL(5,2) SELECT @drop_chance=dropchance FROM [ms] WHERE [id] = @mnum if @RN <= @drop_chance BEGIN --an item will be dropped - selecting which
--selecting and declaring SET @RN = Rand()*100 DECLARE @x int DECLARE @y int SELECT @x = x, @y = y FROM location WHERE membername = @membername DECLARE items CURSOR LOCAL FOR SELECT chance, itemid2 FROM ms_itemdrops WHERE mid2 = @mid2 ORDER BY chance asc --beginning loop
SET @drop_chance = 0 DECLARE @chance DECIMAL(5,2) DECLARE @itemid2 int --assigning selection to "items"
OPEN items WHILE (@@FETCH_STATUS = 0 AND @drop_chance < @RN) BEGIN FETCH NEXT FROM items INTO @chance, @itemid2
SET @drop_chance = @drop_chance + @chance
END CLOSE items DEALLOCATE items INSERT INTO items_dropped (x, y, itemid2) VALUES (@x, @y, @itemid2) END --ending the sequence that makes a m drop an item-- GO -----------------------------
Hvis jeg kalder med for eksempel: execute fight_ms_dropitem 854, 1, 'hotcut' laver den en INSERT som den skal (afhængig af den tilfældige udvælgelse etc...) med QA, men ikke med en ASP side! Der er så vidt jeg kan se derfor ikke problemer med koden. Alle data i tabeller er som de skal være etc..., og koden virker.
Fejlen jeg får i min ASP side er: error '80040e2f' /hidden.asp, line 17 på den linie er: db.execute("execute fight_monsters_dropitem 854, 1, 'hotcut'")
Der skal siges, at jeg med samme connection sagtens kan åbne normale SP's og det hele - så umidelbart vil jeg heller ikke tro at fejlen ligger der.
Er der nogen som kan hjælpe mig med at forstå det? Jeg fatter virkeligt ikke hvad grunden kan være :(
------------ Fejlen jeg får i min ASP side er: error '80040e2f' /hidden.asp, line 17 på den linie er: db.execute("execute fight_ms_dropitem 854, 1, 'hotcut'") --------------
har ændret i variablers navne i ovenstående post, men der er ingen reserverede eller ligenende iblandt dem. Så min execute er stavet rigtigt (selv om det kunne være kønt hvis det var fejlen)
0x80040e2f means DB_E_INTEGRITYVIOLATION. This can be returned from ICommand::Execute, IMultipleResults::GetResult, IRowsetChange::InsertRow, and IRowsetChange::SetData. Usually means that the operation tried to put a value in a field, and that value violated a constraint for the column.
You may want to look at the tables involved and see if they have any constraints, then look at your code and see if you might be violating the constraints when you add or update a record.
ok, når jeg prøver at køre SQL2KSP3.exe skriver den at der ikke er nok ledig plads, og at jeg skal frigøre mere... selv om jeg har 140 gigabytes ledig.
Jeg vender tilbage i morgen, og kigger nærmere på det.
nej, det er ikke grunden... men kan godt se hvorfor det er forvirrende. I koden jeg skrev her ændrede jeg minimalt i enkelte felters navne... I koden jeg tester på heder den skam itemid, og ikke itemid2. Er egentligt dumt at ændre i navnene, men var mere for at gøre det lide overskueligt.
Og som sagt, det virker når QA kører den, men ikke når ASP kører den.
lige nu bruger jeg i ASP: Provider=SQLOLEDB.1;Persist Security Info=False;User ID=**** etc...
er dette en forkert/forældet driver, eller skal der opdateres noget andet på serveren for at ASP driveren virker korrekt?
Det skal lige siges at ASP siden ligger på samme server som SQL Server, men QA ligger på en klient (sidder ved min egen computer og tester det). Kan dette have relevans?
Problemet lå åbenbart i mit loop; @@FETCH_STATUS var på ASP-siden ikke 0 hvis jeg ikke havde lavet en FETCH NEXT.
Derfor gjorde jeg:
OPEN items FETCH NEXT FROM items INTO @chance, @itemid2 WHILE (@@FETCH_STATUS = 0 AND @drop_chance < @RN) BEGIN SET @itemid = @itemid2 SET @drop_chance = @drop_chance + @chance FETCH NEXT FROM items INTO @chance, @itemid2 END CLOSE items DEALLOCATE items INSERT INTO items_dropped (x, y, itemid) VALUES (@x, @y, @itemid)
hvilket gjorde at det virkede over det hele!
Men er der nogen som kan fortælle mig HVORFOR det ikke virkede før? Hvad skal jeg installere for at driverne er UP-TO-DATE?
Jeg bruger godt nok bare "Provider=SQLOLEDB" og ikke "Provider=SQLOLEDB.1", men det er et skud i tågen. Opdatering af MDAC skulle kun give dig en bedre fejlbeskrivelse. Jeg tror at det er i koden, vi skal finde fejlen. "SELECT chance, itemid2 FROM ms_itemdrops WHERE mid2 = @mid2 ORDER BY chance asc" Prøv at checke om der findes nogen itemid2 der er NULL i ms_itemdrops.
JA den havde jeg overset. Du skal altid lave en FETCH NEXT før din loop, da det er FETCH der laver en FETCH_STATUS.
@@FETCH_STATUS Returns the status of the last cursor FETCH statement issued against any cursor currently opened by the connection.
Return value Description 0 FETCH statement was successful. -1 FETCH statement failed or the row was beyond the result set. -2 Row fetched is missing.
Syntax @@FETCH_STATUS
Return Types integer
Remarks Because @@FETCH_STATUS is global to all cursors on a connection, use @@FETCH_STATUS carefully. After a FETCH statement is executed, the test for @@FETCH_STATUS must occur before any other FETCH statement is executed against another cursor. The value of @@FETCH_STATUS is undefined before any fetches have occurred on the connection.
For example, a user executes a FETCH statement from one cursor, and then calls a stored procedure that opens and processes the results from another cursor. When control is returned from the called stored procedure, @@FETCH_STATUS reflects the last FETCH executed in the stored procedure, not the FETCH statement executed before the stored procedure is called.
Examples This example uses @@FETCH_STATUS to control cursor activities in a WHILE loop.
DECLARE Employee_Cursor CURSOR FOR SELECT LastName, FirstName FROM Northwind.dbo.Employees OPEN Employee_Cursor FETCH NEXT FROM Employee_Cursor WHILE @@FETCH_STATUS = 0 BEGIN FETCH NEXT FROM Employee_Cursor END CLOSE Employee_Cursor DEALLOCATE Employee_Cursor
ja ok... men som sagt var @@FETCH_STATUS = 0 når Query Analyzer kørte SP'en... hvilket vel må betyde at de to applikationer bruger forskellige drivere!?
Det burde være ligegyldigt med drivere, da de begge executer en allerede defineret kode på serveren. drivere bliver jeg kun benyttet til at transportere statement og resultat, ikke at udføre opgaver...skulle jeg mene :-)
ja, det ville jeg også tro... men hvis det var tilfældet, ville de vel begge give det samme resultat, når de nu engang har de samme rammer at arbejde ud fra; jeg har givet dem samme database opsætning, men med to forskellige resultater :s
Men det kan selvfølgelig være at andre i gruppen ved noget som vi ikke gør :p
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.