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
11 svar · 271 visningar · startad av Addeladde
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.
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
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
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?
Oj jag har gjort det! En bakåtknapptryckning och sedan uppdatera. Pinsamt
Lyckades dessutom inte redigera utan skapa en nytt inlägg
Snabbt exempel:
Sub kategoriTrad(hID, ID)
Dim kTradRS
....
....
Set kTradRS = Server.CreateObject ("ADODB.Recordset")
kTradRS.CursorLocation = 3 ' adUseClient
kTradRS.Open sqlString, con
....
....
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
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.
Ingen som har nått förslag?
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
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.