webForumDet fria alternativet

Hämta data till listruta

ASPur ASP

69 svar · 2 230 visningar · startad av Vinnaren

Medlem sedan sep. 2005833 inlägg
Frågan#1

Hej

Jag undrar hur man skriver när man ska hämta data från en databas till en nedrullningsbar listruta??

min databaskopling är:

Set objConn = Server.CreateObject("ADODB.Connection")
Set objRS = Server.CreateObject("ADODB.recordset")
objConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("databas.mdb")

samt HTML koden till rutan:

<select name="skribenter" size="3" onChange="this.form.namn.value=this[this.selectedIndex].value;" style="width: 150px;">
</select></font><font face="Verdana"><b><font size="2"><br>
		</font>
	</b><input type="text" name="Skribent" size="45"><b><font size="2"><br>
		Email:</font></b><font size="2"><br>
		</font>
		<input type="text" name="email" size="45">

Tabellen som det ska hämtas ifrån heter "red" och kolumnen "namn".
Kan man även göra så när man trycker på ett namn så kommer dennes Email upp i rutan Email??

Tacksam för all hjälp jag kan få :stud

Medlem sedan dec. 2003487 inlägg
#2

Du kan använda en loop eller spara värdena i en array och sedan använda for.
Nedan har du ett exempel för en loop

Sql sattsen får du sköta själv.

<%

If not objRs.Eof Then

  response.write("<select name=""skribenter"" size=""3"" onChange=""this.form.namn.value=this[this.selectedIndex].value;"" style=""width: 150px;"">")

Do until objRs = nothing
  response.write(<option value=""" & objRs("värde") & """>" & objRs("värde") & "</option>")

objRs.MoveNext
Loop

  response.write("</select>")

End If
%>

Lycka till

Medlem sedan sep. 2005833 inlägg
#3

ok, har provat med

<select name="namn" onChange="document.forms[0].email.value=this[this.selectedIndex].value;" style="width: 150px;">

<%set RS=objConn.execute("SELECT epost, namn FROM red order by namn")
if not RS.eof then
Do until RS.EOF
response.write "<option value="""&RS("epost")&""">"&RS("namn") & "<option>"
RS.Movenext
Loop
RS.close
else
rs.close
end if
%>
</select>

<input type="text" name="email" size="45">

men får följande felmeddelande:

Microsoft JET Database Engine (0x80040E10)
Det har inte angetts något värde för en eller flera nödvändiga parametrar.

på rad: <%set RS=objConn.execute("SELECT epost, namn FROM redaktionen order by namn")

vad kan det vara för fel? :(

Medlem sedan juni 200032 967 inlägg
#4

Det är antagligen ett tabell- eller fältnamn som inte stämmer.

mvh

Medlem sedan sep. 2005833 inlägg
#5

namnen stämmer, kan det vara i konflikt med något annat i koden? Jag hade tänkt att anv. denna till att kunna välja skribentens namn som har skrivit nyheten. Så nyheten sparas i en annan tabell i samma databas som man hämtar skribentens namn och epost ifrån :r

Medlem sedan apr. 20031 660 inlägg
#6

HEJ!

Lite långsökt, men testa sätt [] runt namn, epost och red, botar om du använt reserverade ord. Dock, inget av de bör vara det, inte ens på en svensk access-version. Reservation för 'red', men det är ju ett ord, vilket som.
Dubbel och trippelkolla så fälten och tabellen är rätt, posta annars mer av koden.

Jag tipsar om att du inte ska spara namnet i databasen knutet till nyheten, du spar personens id (räknare).

När man konstruerar databaser gäller att data endast ska finnas på ett ställe, dvs namn (+id och epost, ev mfl) i skribent-tabellen, och skribentens id-nummer är sedan det som sparas tillsammans med nyheten.

Medlem sedan sep. 2005833 inlägg
#7

kan visa lite mer kod som jag har
den som ska hämta skribenternas namn och epost:


<select name="namn" onChange="document.forms[0].email.value=this[this.selectedIndex].value;" style="width: 150px;">

<%
Set objRS = objConn.Execute("SELECT epost, namn FROM red order by namn")
if not RS.eof then
Do until RS.EOF
response.write "<option value="""&RS("epost")&""">"&RS("namn") & "<option>"
RS.Movenext
Loop
RS.close
else
rs.close
end if
%>
</select>

<input type="text" name="email" size="45">

koden som ska spara nyheten (vet att den går att förminska en del)

<%
' Stänger och förstör alla objekt
objRS.Close : Set objRS = nothing
objConn.Close : Set objConn = nothing

' Sparar nyheten
ElseIf Request.QueryString("visa") = "nyhetspara" AND Session("Admin") = "true" Then

    strDatum        = now()
    strRubrik        = SafeSQL(Request.Form("rubrik"))
    strNyhet        = SafeSQL(Request.Form("nyhet"))
    strSkribent        = SafeSQL(Request.Form("Skribent"))
    strlank         = SafeSQL(Request.Form("lank"))
    strlanknamn    = SafeSQL(Request.Form("lanknamn"))
    stremail        = SafeSQL(Request.Form("email"))
    strkategori        = SafeSQL(Request.Form("kategori"))
    

    
    objConn.Execute("INSERT INTO nyheter(Datum,Rubrik,Nyhet,Skribent, lank, lanknamn, email,kategori) VALUES('" & strDatum & "','" & strRubrik & "','" & strNyhet & "','" & strSkribent & "','" & strlank & "','" & strlanknamn & "','" & stremail & "','" & strkategori & "')")
    
    ' Stänger och förstör alla objekt
    Set objRS = nothing : objConn.Close : Set objConn = nothing
    
    Response.Redirect sidnamn & "?visa=nyhet"
    
    
' Ändrar nyheten
ElseIf Request.QueryString("visa") = "nyhetandrat" AND Session("Admin") = "true" Then

    strRubrik        = SafeSQL(Request.Form("rubrik"))
    strNyhet        = SafeSQL(Request.Form("nyhet"))
    strSkribent        = SafeSQL(Request.Form("skribent"))
    strlank         = SafeSQL(Request.Form("lank"))
    strlanknamn        = SafeSQL(Request.Form("lanknamn"))
    stremail        = SafeSQL(Request.Form("email"))
    strkategori        = SafeSQL(Request.Form("kategori"))
    strDatum        = now()

    objConn.execute("Update nyheter Set Rubrik='" & strRubrik & "', Nyhet='" & strNyhet & "', Skribent='" & strSkribent & "', lank='" & strlank & "', lanknamn='" & strlanknamn & "', email='" & stremail & "', datum='" & strdatum & "', kategori='" & strkategori & "' Where id = "& SafeSQL(CLng(Request.Querystring("id"))))

    ' Stänger och förstör alla objekt
    Set objRS = nothing : objConn.Close : Set objConn = nothing

    Response.Redirect sidnamn & "admin.asp?visa=nyhet"

' Tar bort nyheten
ElseIf Request.QueryString("visa") = "tabort" AND Session("Admin") = "true" Then
    objConn.Execute("DELETE FROM nyheter WHERE id="& SafeSQL(CLng(Request.Querystring("id"))))
    Response.Redirect sidnamn & "?visa=nyhet"

    ' Stänger och förstör alla objekt
    Set objRS = nothing : objConn.Close : Set objConn = nothing

End If
%>

så jag vill alltså att man väljer sitt namn när man skriver nyheten, sen så ska namnet och emailen sparas tillsamans med nyheten.

Medlem sedan dec. 2003487 inlägg
#8

Du använder både objRs och RS
Ändra objRs -> RS så borde det fungera

<%
Set [b]RS[/b] = objConn.Execute("SELECT epost, namn FROM red order by namn")
if not RS.eof then
Do until RS.EOF
response.write "<option value="""&RS("epost")&""">"&RS("namn") & "<option>"
RS.Movenext
Loop
RS.close
else
rs.close
end if
%>
</select>

<input type="text" name="email" size="45">

I den nedre kodsnutten borde du först och främst kolla så du använder en av sätten att kalla objektet RS. Vill du använda RS så gör det överallt. När du använder Set RS = så döper du objektet till rs och kommer därför att använda RS tills du stänger det då du skriver RS.Close : set RS = nothing och INTE objRs.Close

Samma med databasobjektet (i ditt fall objConn)

Tänk på att använda så få databasöppningar som möjligt.

<%
' Stänger och förstör alla objekt
RS.Close : Set RS = nothing
objConn.Close : Set objConn = nothing

' Sparar nyheten
ElseIf Request.QueryString("visa") = "nyhetspara" AND Session("Admin") = "true" Then

    strDatum        = now()
    strRubrik        = SafeSQL(Request.Form("rubrik"))
    strNyhet        = SafeSQL(Request.Form("nyhet"))
    strSkribent        = SafeSQL(Request.Form("Skribent"))
    strlank         = SafeSQL(Request.Form("lank"))
    strlanknamn    = SafeSQL(Request.Form("lanknamn"))
    stremail        = SafeSQL(Request.Form("email"))
    strkategori        = SafeSQL(Request.Form("kategori"))
    

    
    objConn.Execute("INSERT INTO nyheter(Datum,Rubrik,Nyhet,Skribent, lank, lanknamn, email,kategori) VALUES('" & strDatum & "','" & strRubrik & "','" & strNyhet & "','" & strSkribent & "','" & strlank & "','" & strlanknamn & "','" & stremail & "','" & strkategori & "')")
    
    ' Stänger och förstör alla objekt
    Varför stänga objRs när den inte är skapad? ta bort detta -> [b]Set objRS = nothing[/b] : objConn.Close : Set objConn = nothing
    
    Response.Redirect sidnamn & "?visa=nyhet"
    
    
' Ändrar nyheten
ElseIf Request.QueryString("visa") = "nyhetandrat" AND Session("Admin") = "true" Then

    strRubrik        = SafeSQL(Request.Form("rubrik"))
    strNyhet        = SafeSQL(Request.Form("nyhet"))
    strSkribent        = SafeSQL(Request.Form("skribent"))
    strlank         = SafeSQL(Request.Form("lank"))
    strlanknamn        = SafeSQL(Request.Form("lanknamn"))
    stremail        = SafeSQL(Request.Form("email"))
    strkategori        = SafeSQL(Request.Form("kategori"))
    strDatum        = now()

    objConn.execute("Update nyheter Set Rubrik='" & strRubrik & "', Nyhet='" & strNyhet & "', Skribent='" & strSkribent & "', lank='" & strlank & "', lanknamn='" & strlanknamn & "', email='" & stremail & "', datum='" & strdatum & "', kategori='" & strkategori & "' Where id = "& SafeSQL(CLng(Request.Querystring("id"))))

    ' Stänger och förstör alla objekt
    Samma här, ta bort -> [b]Set objRS = nothing[/b] : objConn.Close : Set objConn = nothing

    Response.Redirect sidnamn & "admin.asp?visa=nyhet"

' Tar bort nyheten
ElseIf Request.QueryString("visa") = "tabort" AND Session("Admin") = "true" Then
    objConn.Execute("DELETE FROM nyheter WHERE id="& SafeSQL(CLng(Request.Querystring("id"))))
    Response.Redirect sidnamn & "?visa=nyhet"

    ' Stänger och förstör alla objekt
    samma ta bort -> [b]Set objRS = nothing[/b] : objConn.Close : Set objConn = nothing

End If
%>

Nu kanske det blev luddigt, skrev detta som hastigast pga tidsbrist :)
Fråga om du inte förstår vad jag menar

Medlem sedan apr. 20031 660 inlägg
#9

För att slippa skriva stäng- och förstörkod på varje sidan, lägg det i en include-fil, använd därefter den sub som behövs.

Sub close_rs_db()
	RS.close
	Set RS=nothing
	Conn.Close
	Set Conn=nothing
End Sub

'stänger övriga rs, genom tex Call Close_rs(rs3)
Sub Close_rs(byRef RS)
	RS.Close
	Set RS = Nothing
End Sub

'om endast finns Conn att stänga
Sub Close_db()
	Conn.Close
	Set Conn = Nothing
End Sub

Det räcker med Close_db() när du använt insert/update/delete alltså.

Medlem sedan sep. 2005833 inlägg
#10

ok, tack. gjorde tvärt om RS--> objRS, för objRS anv. i databaskopplingen men det ska väll inte vara någon skillnad?

<%
Set objRS = objConn.Execute("SELECT epost, namn FROM redaktionen order by namn")
if not objRS.eof then
Do until objRS.EOF
response.write "<option value="""&objRS("epost")&""">"&objRS("namn") & "<option>"
objRS.Movenext
Loop
objRS.close
else
objRS.close
end if
%>

Tyvärr så hjälpte inte detta, får fortfarande:

Microsoft JET Database Engine (0x80040E10)
Det har inte angetts något värde för en eller flera nödvändiga parametrar.

på raden:
Set objRS = objConn.Execute("SELECT epost, namn FROM red order by namn")

:OO

Medlem sedan apr. 20031 660 inlägg
#11

Vinnaren skrev:

...
Tyvärr så hjälpte inte detta, får fortfarande:

Microsoft JET Database Engine (0x80040E10)
Det har inte angetts något värde för en eller flera nödvändiga parametrar.

på raden:
Set objRS = objConn.Execute("SELECT epost, namn FROM red order by namn")

Och du har testat mina råd? Prova med * istället, annan tabell, ta bort order by, sätt [], så vi närmar oss problemet.

Medlem sedan sep. 2005833 inlägg
#12

ok, provade med:
Set objRS = objConn.Execute("SELECT * FROM val []")

fick då felmeddelandet:
Microsoft JET Database Engine (0x80040E14)
Ogiltiga parenteser kring namnet '[]'.

Medlem sedan apr. 20031 660 inlägg
#13

Hmm, det var väl ändå lite optimistiskt! :h
Citerar mig själv, enligt https://www.webforum.nu/showthread.php?p=1196688#post1196688.

Johnny skrev:

testa sätt [] runt namn, epost och red

Medlem sedan sep. 2005833 inlägg
#14

tyvärr så hjälpte inte det heller :( , men det kan inte kolidera med varandra då jag har ett fält i tabellen nyheter som också heter email?? :r

Medlem sedan apr. 20031 660 inlägg
#15

Nej, du kan ha flera samma fält med i alla tabeller om du vill. Man namnger fältet tabell.fält då. Men, eftersom du endast är i en tabell, påverkar det inte!

Hur gick det med de andra förslagen?

  • * istället
  • annan tabell
  • ta bort order by
Medlem sedan sep. 2005833 inlägg
#16

då kommer det fram:

ADODB.Recordset (0x800A0CC1)
Objektet kunde inte hittas i mängden med det begärda namnet eller numret.

på alla försöken

Medlem sedan apr. 20031 660 inlägg
#17

:q

Alt 1 borde inte ge det.
SELECT * FROM red ORDER BY namn
(hämtar alla fält, och sorterar dem)

Alt 2 borde ge det.
SELECT epost FROM produkter ORDER BY flt
(hämta värde från en annan tabell, försöker sedan visa ett recordsetvärde som inte finns, tex epost från produkttabell)

Alt 3 borde inte heller ge det.
SELECT epost, namn FROM red
(hämtar alla fält från rätt tabell)

Har du verkligen skrivit enligt ovan, gör du något väldigt konstigt!

Medlem sedan sep. 2005833 inlägg
#18

Set objRS = objConn.Execute("SELECT * FROM nyheter ORDER BY rubrik")

fel:
ADODB.Recordset (0x800A0CC1)
Objektet kunde inte hittas i mängden med det begärda namnet eller numret.

fast där så ligger felet på:
response.write "<option value="""&objRS("epost")&""">"&objRS("namn") & "<option>"

samma fel med:
Set objRS = objConn.Execute("SELECT rubrik FROM nyheter ORDER BY rubrik")

likaså med:
Set objRS = objConn.Execute("SELECT rubrik, email FROM nyheter ")

Medlem sedan apr. 20031 660 inlägg
#19

:q

Nu använder du nyheter, är det den tabellen som gäller, eller du missförstod mig? Min tanke var att du skulle testa de tre förslagen var för sig på den tabellen du hade från början, red (alt redaktionen), och se vad som händer.

Att du får fel nu förstår du säkert varför; epost finns inte i tabellen nyheter.

Jag tror det enklaste är att du tänker igenom vad du försöker göra, vad heter fälten, tabellen, hur hämtar jag data och hur skriver jag ut det.

Medlem sedan sep. 2005833 inlägg
#20

ok, gjorde det först då jag fick felmeddelandet:
ADODB.Recordset (0x800A0CC1)
Objektet kunde inte hittas i mängden med det begärda namnet eller numret.

ser nu när jag försökte igen att det inte felet ligger Set objRS = objConn.Execute("SELECT * FROM redaktionen") utan på response.write "<option value="""&objRS("epost")&""">"&objRS("namn") & "<option>"

oj, ser nu att den inte heter epost utan email :S

Men hur gör man nu när man ska spara namnet på den man har valt i dropdownrutan? bara emailen sparas nu. Sen så är det lite "luft" emellan varje namn, hur löser man det?

142 ms totalt · 3 externa anrop · v20260731065814-full.4bcf49fe
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
140 ms — hämta tråd, inlägg och bilagor (db)