Set dbCommand = Server.CreateObject("ADODB.Command")
Set dbCommand.ActiveConnection = Conn
IF NOT Request.QueryString("katID") = "" THEN
katID = SafeSQL(CLng(Request.QueryString("katID")))
dbCommand.CommandText = "SELECT portfolio.potID, portfolio.katID AS portfolio_katID, portfolio.potRubrik, portfolio.potIngress, portfolio.potBeskrivning, portfolio.potBild, portfolio.potStatus, kategori.katID AS kategori_katID, kategori.katNamn, kategori.katTyp FROM kategori LEFT OUTER JOIN portfolio ON kategori.katID=portfolio.katID WHERE portfolio.katID = ? AND kategori.katTyp = 1 AND portfolio.proStatus = 1 ORDER BY portfolio.potID DESC"
dbCommand.Parameters.Append (dbCommand.CreateParameter("katID", adChar, adParamInput, Len(katID), katID))
ELSE
dbCommand.CommandText = "SELECT portfolio.potID, portfolio.katID AS portfolio_katID, portfolio.potRubrik, portfolio.potIngress, portfolio.potBeskrivning, portfolio.potBild, portfolio.potStatus, kategori.katID AS kategori_katID, kategori.katNamn, kategori.katTyp FROM kategori LEFT OUTER JOIN portfolio ON kategori.katID=portfolio.katID WHERE kategori.katTyp = 1 AND portfolio.proStatus = 1 ORDER BY portfolio.potID DESC"
END IF
Set rs = dbCommand.Execute
Response.Write "<h4>"&rs("katNamn")&"</h4>"
IF NOT (rs("potRubrik") = "" OR rs("potRubrik") = null) THEN
DO WHILE NOT rs.EOF
Response.Write rs("potRubrik")
rs.MoveNext
Loop
END IF
rs.Close
Set rs = Nothing
Set dbCommand = Nothing
När den understa sql satsen ska köras får jag följande felmeddelande:
Det har inte angetts något värde för en eller flera nödvändiga parametrar.
på raden:
Set rs = dbCommand.Execute
Hur löser jag detta?? Man kanske inte kan ha if-sats runt om mina sql satser?
TIPS: Eftersom SQL-satserna är närmast identiska så bör du kunna göra det enklare. För in villkoret i SQL-satsen om det behövs.
I övrigt ser jag 6 fel:
1. Du kör SafeSQL på värdet. En av de viktigaste aspekterna med parametriserade frågor är att de är säkrade mot injection. Det är inte bara onödigt att använda SafeSQL, utan det gör också att värdet som faktiskt stoppas in i databasen är det tillfixade värdet (med dubbla apostrofer)
2. Du kör både SafeSQL och clng på värdet. Clng kan inte returnera något som SafeSQL kan bita på.
3. Du har angivit adChar som datatyp. Är det verkligen en char-kolumn? Clng-konverteringen indikerar något annat.
4. Du hoppar direkt på rs("katNamn") etc. utan att kolla rs.EOF
5. Kontroll av null ska göras med isnull(rs("potRubrik")) och ta gärna bort de ointressant posterna redan i SQL-frågan i stället.
6. Du kollar "potRubrik" för första raden, och loopar sedan på med alla.
hmm, oki. Har nu ändrat lite men får fortfarande samma felmeddelande :(
Set dbCommand = Server.CreateObject("ADODB.Command")
Set dbCommand.ActiveConnection = Conn
IF NOT Request.QueryString("katID") = "" THEN
katID = Clng(Request.QueryString("katID"))
dbCommand.CommandText = "SELECT portfolio.potID, portfolio.katID AS portfolio_katID, portfolio.potRubrik, portfolio.potIngress, portfolio.potBeskrivning, portfolio.potBild, portfolio.potStatus, kategori.katID AS kategori_katID, kategori.katNamn, kategori.katTyp FROM kategori LEFT OUTER JOIN portfolio ON kategori.katID=portfolio.katID WHERE portfolio.katID = ? AND kategori.katTyp = 1 AND portfolio.proStatus = 1 ORDER BY portfolio.potID DESC"
dbCommand.Parameters.Append (dbCommand.CreateParameter("katID", adInt, adParamInput, CInt(katID)))
ELSE
dbCommand.CommandText = "SELECT portfolio.potID, portfolio.katID AS portfolio_katID, portfolio.potRubrik, portfolio.potIngress, portfolio.potBeskrivning, portfolio.potBild, portfolio.potStatus, kategori.katID AS kategori_katID, kategori.katNamn, kategori.katTyp FROM kategori INNER JOIN portfolio ON kategori.katID = portfolio.katID WHERE portfolio.proStatus = 1 ORDER BY portfolio.potID DESC"
END IF
Set rs = dbCommand.Execute
IF NOT rs.EOF THEN
DO WHILE NOT (rs.EOF AND isnull(rs("potRubrik")))
Response.Write rs("potRubrik")
rs.MoveNext
Loop
END IF
rs.Close
Set rs = Nothing
Set dbCommand = Nothing
EOF-kollen är fortfarande fel. Man kan inte kolla EOF och samtidigt ett värde från samma RS.
Vad använder du för databas. ConnectionString? Du har definerat konstanterna adInt etc. någonstans (adovbs.inc)?
<%
set dbCommand = Server.CreateObject("ADODB.Command")
set dbCommand.ActiveConnection = Conn
SQLSelect="SELECT portfolio.potID, portfolio.katID AS portfolio_katID, portfolio.potRubrik, portfolio.potIngress, portfolio.potBeskrivning, portfolio.potBild, portfolio.potStatus, kategori.katID AS kategori_katID, kategori.katNamn, kategori.katTyp FROM kategori INNER JOIN portfolio ON kategori.katID=portfolio.katID "
if not Request.QueryString("katID") = "" then
katID = Clng(Request.QueryString("katID"))
SQLWHere=" WHERE portfolio.potRubrik IS NOT NULL AND portfolio.katID = ? AND kategori.katTyp = 1 AND portfolio.proStatus = 1 "
dbCommand.Parameters.Append (dbCommand.CreateParameter("katID", adInt, adParamInput, CInt(katID)))
else
SQLWHere=" WHERE portfolio.potRubrik IS NOT NULL AND portfolio.proStatus = 1 "
end if
dbCommand.CommandText=SQLSelect & SQLWhere & " ORDER BY portfolio.potID DESC"
set rs = dbCommand.Execute
do while not rs.EOF
Response.Write rs("potRubrik")
rs.MoveNext
loop
rs.Close
set rs = Nothing
set dbCommand = Nothing
%>
hmm, det vill inte funka :(, får samma felmeddelande även om jag bara anv en sql sats. Jag har "nästan" en likadan ovanför denna som funkar som ser ut:
<%
Set dbCommand = Server.CreateObject("ADODB.Command")
Set dbCommand.ActiveConnection = Conn
dbCommand.CommandText = "SELECT katID, katNamn FROM kategori WHERE katTyp = 1 ORDER BY katNamn ASC"
Set rs = dbCommand.Execute
DO WHILE NOT rs.EOF
Response.Write "<li>"&rs("katNamn")&"</li>"
rs.MoveNext
Loop
rs.Close
Set rs = Nothing
Set dbCommand = Nothing
%>
Den fungerar, men inte den andra. De ligger på samma sida, så det blir ingen konflikt? Borde ju gå o lösa på nott sätt? :q
Har nu räknat ut att det måste vara sql frågan som e fel, själva WHERE delen
ok, nu funkar det men inte redigt som tänkt. Jag har nu en kategori vid namn test. Den andra tabellen är tom, så jag vill få utskrivet namnet på den anropande kategorin. Det är inte bara när det finns något i den andra tabellen som kategorinamnet ska skrivas ut. Provar jag att anropa katID=1 (test) så får jag ut felmeddelandet: Undantag inträffade. på:
Du får byta från INNER JOIN till LEFT JOIN och flytta alla eventuella villkor på den andra tabellen från WHERE-satsen till join-instruktionen. (Eventuellt tycker inte Access om det - då får du nog skippa villkoren på den andra tabellen helt)
SQLSelect="SELECT portfolio.potID, portfolio.katID AS portfolio_katID, portfolio.potRubrik, portfolio.potIngress, portfolio.potBeskrivning, portfolio.potBild, portfolio.potStatus, kategori.katID AS kategori_katID, kategori.katNamn, kategori.katTyp FROM kategori LEFT OUTER JOIN portfolio ON kategori.katID=portfolio.katID "
if not Request.QueryString("katID") = "" then
katID = Clng(Request.QueryString("katID"))
SQLWHere=" WHERE portfolio.katID = ? AND kategori.katTyp = 1 AND portfolio.potStatus = 1 "
dbCommand.Parameters.Append (dbCommand.CreateParameter("katID", adInteger, adParamInput, 4, CInt(katID)))
else
SQLWHere=" WHERE portfolio.potStatus = 1 AND kategori.katTyp = 1"
end if