Avatar billede tuctoh Nybegynder
04. august 2003 - 22:37 Der 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 :(
Avatar billede tuctoh Nybegynder
04. august 2003 - 22:38 #1
rettelse :p

------------
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)
Avatar billede d-fens Nybegynder
04. august 2003 - 22:56 #3
That error from SQLServer means:

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.
Avatar billede erikjacobsen Ekspert
04. august 2003 - 22:56 #4
Skal du starte sætningen med "execute ..." ?
Avatar billede tuctoh Nybegynder
04. august 2003 - 22:58 #5
ja, hvis jeg kalder en stored procedure... eller bare exec.
Men d-fens har nok ret
Avatar billede d-fens Nybegynder
04. august 2003 - 23:02 #6
Højest sandsynligt fordi at du bruge oledb (MDAC) via ASP, og at QA kører noget andet.
Avatar billede tuctoh Nybegynder
04. august 2003 - 23:04 #7
hmm... så er det den nyeste servicepack til SQL Server jeg skal bruge, eller...?

http://www.microsoft.com/downloads/details.aspx?FamilyId=90DCD52C-0488-4E46-AFBF-ACACE5369FA3&displaylang=en

er der 3 filer - hvad for én er det der skal installeres?

Er lidt forvirrende :( Troede SQL Server opdaterede sig ved Windows Update
Avatar billede tuctoh Nybegynder
04. august 2003 - 23:20 #8
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.
Avatar billede dfens Nybegynder
05. august 2003 - 08:03 #9
MDAC kan hentes på www.microsoft.com/data, men hvis du ikke allerede har en sp3 på så skader det ikke. mdac er vist med i den også
Avatar billede tuctoh Nybegynder
05. august 2003 - 09:52 #10
Hej,

Jeg har gode nyheder og dårlige nyheder.
Jeg har nu installeret Servicepack 3 (fejlen før var fordi mappen ikke fandtes).

Denne opgradering har også installeret nye MDAC versioner så vidt jeg kunne se på installationen.

Dette har gjort at fejlen er mindre ulæselig nu:

-----------------
Microsoft OLE DB Provider for SQL Server error '80040e2f'

Cannot insert the value NULL into column 'itemid', table 'mindb.dbo.items_dropped'; column does not allow nulls. INSERT fails.

/hidden.asp, line 17
------------------

hvilket jo viser at @itemid af en eller anden grund bliver NULL igennem det loop - men som sagt kun når ASP kalder den, men ikke når QA kalder den.

Kan dette stadig skyldes forkerte drivere af en eller anden art? Eller hvad er årsagen?
Avatar billede dfens Nybegynder
05. august 2003 - 10:00 #11
Står der direkte "db.execute("execute fight_ms_dropitem 854, 1, 'hotcut'")"
i din kode, eller er den sammensat af variabler.

Hvis det sidste er tilfældet, så prøv at poste din asp-kode.
Avatar billede tuctoh Nybegynder
05. august 2003 - 10:17 #12
lige nu står der
db.execute("execute fight_ms_dropitem 854, 1, 'hotcut'")"
hvilket er det samme som jeg kørte fra SQL'en.

Normalt ville der være variabler, men lige nu når jeg tester er det uden.
Avatar billede dfens Nybegynder
05. august 2003 - 10:27 #13
"INSERT INTO items_dropped (x, y, itemid2) VALUES (@x, @y, @itemid2)"

Cannot insert the value NULL into column 'itemid', table 'mindb.dbo.items_dropped'; column does not allow nulls. INSERT fails.

Det er ikke fordi at du indsætter den itemid2, istedet for itemid?
Avatar billede tuctoh Nybegynder
05. august 2003 - 10:31 #14
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?
Avatar billede tuctoh Nybegynder
05. august 2003 - 10:56 #15
ok, nu begynder det at ligne noget.

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?
Avatar billede dfens Nybegynder
05. august 2003 - 10:57 #16
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.
Avatar billede dfens Nybegynder
05. august 2003 - 11:00 #17
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
Avatar billede tuctoh Nybegynder
05. august 2003 - 11:01 #18
nej, der er ikke nogen itemid2 som er null :(

Men som sagt, hvis det var direkte i koden, ville det vel ikke virke fra QA?
Avatar billede tuctoh Nybegynder
05. august 2003 - 11:02 #19
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!?
Avatar billede dfens Nybegynder
05. august 2003 - 11:04 #20
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 :-)
Avatar billede tuctoh Nybegynder
05. august 2003 - 11:06 #21
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
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester