webForumDet fria alternativet

Fel på kategorilistning "An exception occurred"

ASP

11 svar · 273 visningar · startad av Addeladde

Medlem sedan jan. 20013 406 inlägg
Frågan#1

Jag försöker lista kategorier ur en databas. Kategorierna kan ha 4 st underkategorier.

Tabellen ser ut enligt följande:

kategoriID    KategoriHuvud   KategoriNamn

Kategori huvud anger ID på den kategori som den ligger under. Om huvud är 0 så är det en huvudkategori.

På denna kod nedan får jag detta felmeddelande:

Microsoft VBScript runtime error '800a01fb'
An exception occurred: 'con.Execute'
/admin/moduler/kategori.asp, line 15

Antar att det kan bero på att det är aldeläs för många databasanropp. Eller?
Kan man kanske göra det på något smartare sätt eller ändra i koden så att det inte blir några fel?

' Öppna dataförbindelsen
Set con = Server.CreateObject("ADODB.Connection")
con.Open Application("cmdatabas")

action = Trim(request("action"))

Sub kategoriTrad(hID, ID)
  sqlString = "SELECT * " &_
  "FROM kategorier " &_
  "Where kategoriID = "& hID 
  [b]SET kTradRS = Con.Execute( sqlString )[/b]'Line 15
  If not kTradRS.Eof Then
    strKategoriTrad = kTradRS("kategoriNamn") & "\" & strKategoriTrad
    underID = kTradRS("kategoriID")
	huvudID = kTradRS("kategoriHuvud")
    kTradRS.close : Set kTradRS = Nothing
	If not huvudID = 0 Then
	  call kategoriTrad(huvudID, ID)
	Else 
	   adoRS.AddNew
        adoRS( "id" ) = ID
		adoRS( "kategori" ) = strKategoriTrad
	  adoRS.Update  
	End If
  End If
End Sub

'Skapa recordsettet som kategorierna ska läggas in i
			 set adoRS = Server.CreateObject( "ADODB.Recordset" )
		     adoRS.CursorLocation = 3
			 adoRS.Fields.Append "Id", adInteger
			 adoRS.Fields.Append "kategori", adVarChar, 100
			 adoRS.Open
			
			sqlString = "SELECT * " &_
			  "FROM kategorier " 
			SET kategorinRS = Con.Execute( sqlString )
			
			While not kategorinRS.EOF
  			   strKategoriTrad = kategorinRS("kategoriNamn") & "\" & strKategoriTrad  
			   
			   If not kategorinRS("kategoriHuvud") = 0 Then
			     call kategoriTrad(kategorinRS("kategoriHuvud"), kategorinRS("kategoriID"))
			   Else
			     adoRS.AddNew
        	       adoRS( "id" ) = kategorinRS("kategoriID")
				   adoRS( "kategori" ) = kategorinRS("kategoriNamn") & "\"
	             adoRS.Update  
		       End If
			   strKategoriTrad = ""
			   kategorinRS.MoveNext
			 Wend
				
			 kategorinRS.close
			 set kategorinRS = nothing
			%>

Jag skapar ett eget recordsätt för att kunna sortera det på rätt sätt när jag hämtat informationen från databasen.

Medlem sedan sep. 2003301 inlägg
#2

Hmm kan du verkligen ställa en SQLfråga av typen SELECT om con.Execute ?

Kräver inte det ett recordset ?
kTradRS är ju inte ett Recordset vad jag ser utan bara en instans av con.Execute

Medlem sedan juni 200032 967 inlägg
#3

När kommer felmeddelandet? Direkt eller efter att subrutinen kallat sig själv? Recordsetobjektet bör du dimma i subrutinen så det det är lokalt, och om jag var du hade jag sett till att använda frånkopplade recordsets för att undvika låsningar.

- - - - - - - - - -

Fraggel skrev:

Hmm kan du verkligen ställa en SQLfråga av typen SELECT om con.Execute ?

Kräver inte det ett recordset ?
kTradRS är ju inte ett Recordset vad jag ser utan bara en instans av con.Execute

Det skapas ett recordset om man ställer SQL-frågor på det viset ja. Det är bara om man behöver ange cursortyp eller låstyp som man behöver skapa ett recordset först mha set obj = server.createobject("adodb.recordset"). På devguru kan man läsa mycket trevligt, exempelvis:

Devguru skrev:

The Execute method is used to execute the specified query, SQL statement, stored procedure, or provider-specific text. If it is a row-returning query, the results (if any) will be stored in a new RecordSet object. If it is a non-row-returning query, the provider will return a closed RecordSet object.

Källa: http://www.devguru.com/technologies/ado/quickref/connection_execute.html .

Bokmärk.

mvh

Medlem sedan jan. 20013 406 inlägg
#4

Det konstiga är att sql-frågan har fungerat. Det verkar låsa hela databasen (access) för sen fungerar väldigt få sidor men samtidigt fungerar vissa som även dem har sql-frågor.

Ifall jag lägger till On error resume next på sidan så körs funktionen några gånger men avbryts.

Recordsetobjektet bör du dimma i subrutinen så det det är lokalt, och om jag var du hade jag sett till att använda frånkopplade recordsets för att undvika låsningar.

Ok exempel?

Medlem sedan jan. 20013 406 inlägg
#5

Oj jag har gjort det! En bakåtknapptryckning och sedan uppdatera. Pinsamt

Medlem sedan jan. 20013 406 inlägg
#6

Lyckades dessutom inte redigera utan skapa en nytt inlägg

Medlem sedan juni 200032 967 inlägg
#7

Snabbt exempel:

Sub kategoriTrad(hID, ID)
     Dim kTradRS
     ....
     ....
     Set kTradRS = Server.CreateObject ("ADODB.Recordset")
     kTradRS.CursorLocation = 3 ' adUseClient
     kTradRS.Open sqlString, con
     ....
     ....
Medlem sedan jan. 20013 406 inlägg
#8

Nu får jag:

An exception occurred: 'kTradRS.Open'

Sub kategoriTrad(hID, ID)
  
  Dim kTradRS
  sqlString = "SELECT * " &_
  "FROM kategorier " &_
  "Where kategoriID = "& hID 
  Set kTradRS = Server.CreateObject ("ADODB.Recordset")
  kTradRS.CursorLocation = 3 ' adUseClient
  kTradRS.Open sqlString, con

  If not kTradRS.Eof Then
    strKategoriTrad = kTradRS("kategoriNamn") & "\" & strKategoriTrad
    underID = kTradRS("kategoriID")
	huvudID = kTradRS("kategoriHuvud")
    kTradRS.close : Set kTradRS = Nothing
	If not huvudID = 0 Then
	  call kategoriTrad(huvudID, ID)
	Else 
	   adoRS.AddNew
        adoRS( "id" ) = ID
		adoRS( "kategori" ) = strKategoriTrad
	  adoRS.Update  
	End If
  End If
End Sub
Medlem sedan jan. 20013 406 inlägg
#9

Dessa problem fanns inte då databasen var relativt tom på kategorier. Förslag på smartare sätt att göra detta på?

Alltså kategorilistningen ska kunna se ut på följande sätt:
Där man lägger till nya kategorier ska kunna se ut på följande sätt:

Hantverk\
Hantverk\Trä\
Hantverk\Trä\Statyetter\
Hantverk\Trä\Statyetter\Djur\
Hantverk\Trä\Statyetter\Ljusstakar\
Hantverk\Trä\Vägghängt\mask\
kläder\
kläder\dam\
kläder\dam\medium\
kläder\dam\medium\klänningar\

Eftersom man måste kunna lägga till kategorier under alla kategorier.

Medlem sedan jan. 20013 406 inlägg
#10

Ingen som har nått förslag?

Medlem sedan dec. 19996 721 inlägg
#11

Det beror lite på vad du vill göra med ditt nya recordset. Eventuellt behöver du inget...


kategoriTrad 0, ""

Sub kategoriTrad(hID,Tree)
  Dim sqlString, kTradRS, strKategoriTrad 
  sqlString = "SELECT * " &_
  "FROM kategorier " &_
  "Where kategoriID = "& hID & " ORDER BY KategoriNamn
"
  SET kTradRS = Con.Execute( sqlString )
  do until kTradRS.Eof 
    strKategoriTrad = Tree & "\" & kTradRS("kategoriNamn")
    response.write strKategoriTrad   & "<BR>"
    kategoriTrad kTradRS("kategoriID"),strKategoriTrad 
    kTradRS.Movenext
  loop
  kTradRS.Close
End Sub
Medlem sedan jan. 20013 406 inlägg
#12

emission skrev:

Det beror lite på vad du vill göra med ditt nya recordset. Eventuellt behöver du inget...

Jag använder det i en selectlista för att välja vilken kategor det handlar om. Man vill ju också se hur kategorin ligger under andra kategorier därför dessa krångliga och långa sql-satser.

262 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
129 ms — deklarationer (db)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)
129 ms — ändringar (db)