[asp] Insert probleem

Pagina: 1
Acties:

  • intrix
  • Registratie: November 2002
  • Laatst online: 04-12-2023
**nieuw vraag in laatste replay (inzake ADO COMMAND)**

Ok, ik ben nu aan het onderzoeken hoe asp werkt dus
don't kill me enzo hoor ...

Maar goed;

ik moet dus iets in een acces db weg knallen en dat doe ik met het volgende
stukje code:

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<%@LANGUAGE="VBSCRIPT" CODEPAGE="1252"%>
<!-- #INCLUDE FILE="datastore.inc" -->
<!-- #INCLUDE FILE="..\..\..\i&ascripts\adovbs.inc" -->
<%  
server.scripttimeout=15

Dim DbConn
Dim RsMailList
Dim SqlMailList 

'de connectie (DbConn) en de recordset (RsMailList) en queries (SqlMailList)

 Set DbConn = Server.CreateObject("Adodb.Connection")
 Set RsMailList = Server.CreateObject("Adodb.Recordset") 

    SqlMailList = "INSERT INTO datum (bericht_id, bericht_datum) VALUES ('139', '2/4/2004')"

 DbConn.Open strConnect
 RsMailList.Open SqlMailList, DbConn, adOpenStatic, adLockOptimistic

'  If RsMailList.EOF Then
'     Response.Write "Helaas zijn er geen gegevens gevonden."
'   Else
'     Do Until RsMailList.EOF
'       Response.Write RsMailList("bericht_id") & " - " & RsMailList("bericht_datum") & ""
'       RsMailList.MoveNext
'     Loop
'    End If

 RsMailList.Close
 DbConn.Close

 Set RsMailList = Nothing
 Set DbConn = Nothing

%>


niet gelijk uithalen, ik heb dit stukje inderdaad eerst gebruikt om iets UIT de db
te halen en daarna gewoon zo laten staan en de sql opdracht aangepast.

het ligt trouwens niet aan de rechten, want als ik met een ander script wat al bestaat probeer iets weg te schrijven in de db lukt dat wel, het verschil
is dat die persoon dat zonder sql geschreven heeft en dus addrecord gebruikt.

maar als ik deze code uitvoer krijg ik dus de volgende error:

code:
1
2
3
4
5
ADODB.Recordset error '800a0e78' 

Operation is not allowed when the object is closed. 

/intrascripts/lichtkrant/tryout.asp, line 37


wat kan er aan de hand zijn dan ik snap het niet 100%


zou ik soms eerst de tabel moeten openen met het open command
en DAN pas de sql querie uitvoeren met rsmaillist.execute ofzo?

nou ja alvast bedankt greetz!

[ Voor 10% gewijzigd door intrix op 04-02-2004 12:41 ]

welcome my son, welcome to the machine


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Voor zover ik me herinner, gebruik je een RecordSet object enkel bij SELECT queries. Als je dus gegevens moet ophalen, aangezien die recordset dan de opgehaalde gegevens bevat.

Voor het uitvoeren van een INSERT / UPDATE / DELETE moet je een Command object gebruiken.

Daarnaast mag je ook geen quotes zetten rond numerieke gegevens.

https://fgheysels.github.io/


  • xtra
  • Registratie: November 2001
  • Laatst online: 19-11-2025
Voor INSERT, UPDATE etc. wordt over het algemeen het ADO Command object gebruikt:

cmd.ActiveConnection = ...
cmd.CommandText = "INSERT... etc."
cmd.Execute

Kijk daar eens naar...

  • intrix
  • Registratie: November 2002
  • Laatst online: 04-12-2023
whoami schreef op 04 februari 2004 @ 11:41:
Voor zover ik me herinner, gebruik je een RecordSet object enkel bij SELECT queries. Als je dus gegevens moet ophalen, aangezien die recordset dan de opgehaalde gegevens bevat.

Voor het uitvoeren van een INSERT / UPDATE / DELETE moet je een Command object gebruiken.

Daarnaast mag je ook geen quotes zetten rond numerieke gegevens.
code:
1
2
3
4
5
6
7
8
9
 Set DbConn = Server.CreateObject("Adodb.Connection")
 Set RsMailList = Server.CreateObject("Adodb.Recordset") 

    SqlMailList = "INSERT INTO datum (bericht_id, bericht_datum) VALUES ('139', '2/4/2004')"

 DbConn.Open strConnect
 RsMailList.Open "datum", DbConn, adOpenStatic, adLockOptimistic

 RsMailList.Execute SqlMailList


Ok dus als ik het goed begrijp RsMailList.Execute moet DbConn.Execute zijn :)

welcome my son, welcome to the machine


  • intrix
  • Registratie: November 2002
  • Laatst online: 04-12-2023
xtra schreef op 04 februari 2004 @ 11:43:
Voor INSERT, UPDATE etc. wordt over het algemeen het ADO Command object gebruikt:

cmd.ActiveConnection = ...
cmd.CommandText = "INSERT... etc."
cmd.Execute

Kijk daar eens naar...
en voor zo'n action command moet ik het volgende doen:
(als ik het goed begrijp)

code:
1
2
3
4
5
set conn=Server.CreateObject("ADODB.Connection")
conn.Provider="Microsoft.Jet.OLEDB.4.0"
conn.Open "D:\Inetpub\intra\intrascripts\lichtkrant\lichtkrant.mdb;"

set objCommand=Server.CreateObject("ADODB.command")


en dan kan ik vervolgens

code:
1
2
3
cmd.ActiveConnection = ... 
cmd.CommandText = "INSERT... etc."
cmd.Execute


uitvoeren?

welcome my son, welcome to the machine


  • DeverauX
  • Registratie: Februari 2002
  • Niet online

DeverauX

Focus is everything

intrix schreef op 04 februari 2004 @ 11:49:
[...]

Ok dus als ik het goed begrijp RsMailList.Execute moet DbConn.Execute zijn :)
Niet alleen. Je maakt nu onnodig nog steeds een recordset aan en probeert deze te openen.
Probeer het eens op de volgende manier:
code:
1
2
3
4
5
6
7
 Set DbConn = Server.CreateObject("Adodb.Connection")

SqlMailList = "INSERT INTO datum (bericht_id, bericht_datum) VALUES ('139', '2/4/2004')"

DbConn.Execute SqlMailList
DnConn.Close
Set DbConn = Nothing


Zie ook:
ADO Tutorial ;)

...whatever was distasteful or unpleasant or uncomfortable or painful - music could always soothe that.
All you have to do is reach out to beauty.
Quincy Jones


  • xtra
  • Registratie: November 2001
  • Laatst online: 19-11-2025
Inderdaad. Wel even de puntjes aanvullen :)

  • intrix
  • Registratie: November 2002
  • Laatst online: 04-12-2023
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<%  
server.scripttimeout=15

Dim DbConn
Dim RsMailList
Dim SqlMailList 

'de connectie (DbConn) en de recordset (RsMailList) en queries (SqlMailList)

 Set DbConn = Server.CreateObject("Adodb.Connection")

  SqlMailList = "INSERT INTO datum (bericht_id, bericht_datum) VALUES ('139', '2/4/2004')"

 DbConn.Open strConnect
 DbConn.Execute SqlMailList
 DbConn.Close

 Set RsMailList = Nothing
 Set DbConn = Nothing%>


zo werkt het dus :)

[ Voor 15% gewijzigd door intrix op 04-02-2004 12:10 ]

welcome my son, welcome to the machine


  • intrix
  • Registratie: November 2002
  • Laatst online: 04-12-2023
DeverauX schreef op 04 februari 2004 @ 11:59:
[...]

Niet alleen. Je maakt nu onnodig nog steeds een recordset aan en probeert deze te openen.
Probeer het eens op de volgende manier:
code:
1
2
3
4
5
6
7
 Set DbConn = Server.CreateObject("Adodb.Connection")

SqlMailList = "INSERT INTO datum (bericht_id, bericht_datum) VALUES ('139', '2/4/2004')"

DbConn.Execute SqlMailList
DnConn.Close
Set DbConn = Nothing


Zie ook:
ADO Tutorial ;)
edit:*laat ik daar bovenstaande info nou net vandaan hebben gehaald :D*
dan zegt ie dat je de db nog niet geopend hebt!

code:
1
2
3
4
5
ADODB.Connection error '800a0e78' 

Operation is not allowed when the object is closed. 

/intrascripts/lichtkrant/tryout.asp, line 24

[ Voor 9% gewijzigd door intrix op 04-02-2004 12:10 ]

welcome my son, welcome to the machine


  • DeverauX
  • Registratie: Februari 2002
  • Niet online

DeverauX

Focus is everything

En waarvoor heb je die recordset nou nog steeds nodig dan. :? ;)
intrix schreef op 04 februari 2004 @ 12:07:
[...]


dan zegt ie dat je de db nog niet geopend hebt!
Ja oke, je moet je conn nog wel openen. Ik zie dit dat in mijn voorbeeld ontbreekt. Ik geef je echter een idee, geen kant-en-klare code. O-) :p

[ Voor 71% gewijzigd door DeverauX op 04-02-2004 12:11 ]

...whatever was distasteful or unpleasant or uncomfortable or painful - music could always soothe that.
All you have to do is reach out to beauty.
Quincy Jones


  • xtra
  • Registratie: November 2001
  • Laatst online: 19-11-2025
Maar waarvoor heb je dat recordset object er staan?

Dit werkt inderdaad. Als je meerdere inserts o.i.d. achter elkaar wilt doen is het command object wel sneller.

  • intrix
  • Registratie: November 2002
  • Laatst online: 04-12-2023
xtra schreef op 04 februari 2004 @ 12:09:
[...]

Maar waarvoor heb je dat recordset object er staan?

Dit werkt inderdaad. Als je meerdere inserts o.i.d. achter elkaar wilt doen is het command object wel sneller.
Ok, dan moet ik dat maar aanmaken, even uitzoeken hoe dat werkt

code:
1
2
3
4
5
set conn=Server.CreateObject("ADODB.Connection") 
conn.Provider="Microsoft.Jet.OLEDB.4.0" 'dit wordt dan provider variabele
conn.Open "c:/webdata/northwind.mdb"set comm=Server.CreateObject ' en het gequote gedeelte wordt dan variabele path ofzo ("ADODB.Command")
comm.ActiveConnection=conn
response.write(comm.ActiveConnection)conn.close


dit komt letterlijk van w3schools ..

het enige wat dan best vervelend is, is dat ze hier een datastore.inc gebruiken
met die connectstring die moet ik dan weer gaan verdelen in 2 kleine extra strings
zoiets als provider en path ofzo en die dan invullen in die code

welcome my son, welcome to the machine


  • intrix
  • Registratie: November 2002
  • Laatst online: 04-12-2023
[quote]intrix schreef op 04 februari 2004 @ 12:02:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<%  
server.scripttimeout=15

Dim DbConn
Dim RsMailList
Dim SqlMailList 

'de connectie (DbConn) en de recordset (RsMailList) en queries (SqlMailList)

 Set DbConn = Server.CreateObject("Adodb.Connection")

  SqlMailList = "INSERT INTO datum (bericht_id, bericht_datum) VALUES ('139', '2/4/2004')"

 DbConn.Open strConnect      'connectie met db
 DbConn.Execute SqlMailList   'voer sql uit op db
 DbConn.Close                        'sluit verbinding met db

 Set RsMailList = Nothing
 Set DbConn = Nothing%>



eerlijk gezegd snap ik niet wat dat
set objCommand=Server.CreateObject("ADODB.command")
nou voor extra functie heeft?

wat doet dat command dan precies kan iemand mij dat uitleggen?

Ik begrijp wel dat het sneller is maar niet hoe het werkt en hoe je
het precies toepast?!

[ Voor 12% gewijzigd door intrix op 04-02-2004 12:39 ]

welcome my son, welcome to the machine


  • JJvG
  • Registratie: Juli 2003
  • Laatst online: 27-04 16:49
Maak een bestand genaamd conn.asp en include dit in al je pagina's:

ASP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
'conn.asp
'Globale variabele voor je connectie
Dim objConn

'Openen van de verbinding
Public Sub OpenConnetion
    Set objConn = Server.CreateObject("Adodb.Connection")
    objConn.Provider="Microsoft.Jet.OLEDB.4.0"
    'Path naar je database
    objConn.Open "D:\Inetpub\intra\intrascripts\lichtkrant\lichtkrant.mdb;"
End Sub

'Sluiten van de verbinding
Public Sub CloseConnection
    objConn.Close
    Set objConn = Nothing
End Sub


Vervolgens kan je in je asp pagina ALTIJD gebruik maken van je connectie als je doet
ASP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!--#include file="include/conn.asp"-->
<%
OpenConnection
%>
<html>
<body>
<!-- Je webpagina -->
<%
'Call objConn.Execute (strSQL)
'of
'Dim rs
'Set rs = objConn.Execute (strSQL)
%>
</body>
</html>
<%
CloseConnection
%>


Nog een ander ding: Geef je include-files NOOIT de extensie .INC, want die worden door de IIS ongecompileerd geinclude en zijn ook leesbaar voor anderen als je ze los aanspreekt. Dit is een methode die je website kwetsbaar maakt! Je username-password voor database's kan namelijk ongecodeerd worden weergegeven.

[ Voor 26% gewijzigd door JJvG op 04-02-2004 13:17 ]


  • intrix
  • Registratie: November 2002
  • Laatst online: 04-12-2023
[b]JJvG schreef op 04 februari 2004 @ 13:08:

Nog een ander ding: Geef je include-files NOOIT de extensie .INC, want die worden door de IIS ongecompileerd geinclude en zijn ook leesbaar voor anderen als je ze los aanspreekt. Dit is een methode die je website kwetsbaar maakt! Je username-password voor database's kan namelijk ongecodeerd worden weergegeven.
wat is dan een beter extensie?

welcome my son, welcome to the machine


  • JJvG
  • Registratie: Juli 2003
  • Laatst online: 27-04 16:49
Een betere extensie is voor je includes is .asp dan wordt het geparsed voordat je het voorgeschoteld krijgt.

Zie ook het voorbeeld dat ik gaf (met include-voorbeeld!)

  • intrix
  • Registratie: November 2002
  • Laatst online: 04-12-2023
Wat te doen met vreselijke sqlQueries?

de volgende gegevens moeten in de tabel worden opgenoemen

Titel, TitelColor, TitelBgr, BanTop, BanTopPos, BanBot, BanBotPos, Msg, MsgColor, MsgBgr, MsgPos, MsgFont, Img, ImgPos, StartDate, EndDate, FreqDate, Time

zoals je ziet is dat al een vreselijke regel en dan heb ik de sql nog niet eens
laten zien dan krijg je dus dit:

code:
1
2
3
4
5
6
7
8
9
10
11
SqlMailList = "INSERT INTO bericht (Titel, TitelColor, TitelBgr, "
sqlMailList = sqlMailList & "BanTop, BanTopPos, BanBot, BanBotPos, Msg, MsgColor, MsgBgr, "
sqlMailList = sqlMailList & "MsgPos, MsgFont, Img, ImgPos, StartDate, EndDate, FreqDate, Time)"
sqlMailList = sqlMailList & " VALUES ('" &  Request("Titel") &"','" & Request("TitelColor")  & "','"
sqlMailList = sqlMailList & Request("TitelBgr")  & "','" & Request("BanTop") & "','" & Request("BanTopPos")  &"','"
sqlMailList = sqlMailList & Request("BanBot")  &"','" & Request("BanBotPos")  &"','" & Request("Msg")  &"','"
sqlMailList = sqlMailList & Request("MsgColor")  &"','" & Request("MsgBgr")  &"','"
sqlMailList = sqlMailList & Request("MsgPos")  &"','" & Request("MsgFont")  &"','"
sqlMailList = sqlMailList & Request("Img")  &"','" & Request("ImgPos")  &"','"
sqlMailList = sqlMailList & Request("StartDate")  &"','" & Request("EndDate")  &"','"
sqlMailList = sqlMailList & Request("FreqDate")  &"'," & Request("Time") &")"


en zie daar maar eens een fout uit te halen

code:
1
2
3
4
5
6
INSERT INTO bericht (Titel, TitelColor, TitelBgr, BanTop, BanTopPos, BanBot, BanBotPos, Msg, MsgColor, MsgBgr, MsgPos, MsgFont, Img, ImgPos, StartDate, EndDate, FreqDate, Time) VALUES ('arno','#000000','#000000','','left','','left','zegt Die staan NIet allemaal Aan breezer TyPeN iS BeSt VeRmOeIeNd','#000000','#000000','left','Arial','','left','2/4/2004','2/4/2004','eens',5) 
Microsoft JET Database Engine error '80040e14' 

Syntax error in INSERT INTO statement. 

/intrascripts/lichtkrant/addreal.asp, line 30


Hoe doen jullie dat? want dit gaat niet werken :S

[ Voor 50% gewijzigd door intrix op 04-02-2004 14:49 . Reden: Help zelfs mijn reply is niet meer te overzien ]

welcome my son, welcome to the machine


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Ik gebruik parametrized queries.

In de P&W FAQ vind je onder het puntje 'SQL' een stukje over parametrized queries, met code voorbeelden in C#.
Hoe je het in ASP doet, zal je zelf even moeten opzoeken.

https://fgheysels.github.io/


  • DeverauX
  • Registratie: Februari 2002
  • Niet online

DeverauX

Focus is everything

intrix schreef op 04 februari 2004 @ 14:48:
Hoe doen jullie dat? want dit gaat niet werken :S
Response.Write sqlMailList en debuggen maar. :+

Het is ook aan te raden voortaan je request te specificeren met de collectie; Request.Form/Request.Querystring ;)
Mocht je daarnaast trouwens geen gebruik maken van parametrized queries, dan lijkt het me verstandig dat je de input eerst controleert op single quotes e.d. voordat je deze in je query gebruikt. :)

...whatever was distasteful or unpleasant or uncomfortable or painful - music could always soothe that.
All you have to do is reach out to beauty.
Quincy Jones


Verwijderd

Bij datum variable (startDate & endDate) moeten er geen enkele quotes omheen(') , maar hekjes (#).
Verder bij nummerieke waardes moeten er helemaal geen quotes omheen

Je kan natuurlijk voordat je die sql query uitvoert hem op het scherm schrijven.
Je kan dan al vaak zien waar de fout ligt.

dus
ASP:
1
 response.write "strSQL = " & sqlMailList 


uiteraard dan geen response.redirect gerbuiken. ;)

  • intrix
  • Registratie: November 2002
  • Laatst online: 04-12-2023
DeverauX schreef op 04 februari 2004 @ 15:00:
[...]

Response.Write sqlMailList en debuggen maar. :+

Het is ook aan te raden voortaan je request te specificeren met de collectie; Request.Form/Request.Querystring ;)
Mocht je daarnaast trouwens geen gebruik maken van parametrized queries, dan lijkt het me verstandig dat je de input eerst controleert op single quotes e.d. voordat je deze in je query gebruikt. :)
Request.Form("Title") wordt het dan dus ok!

maar eh Parametrized Queries ??? wa bennuh dah?

P&W FAQ - SQL

ben het al uitzoeken!!

Mzz het is iets korter maar nog steeds HEEL lang hoor :P

code:
1
2
Sql = "INSERT INTO bericht (Titel, TitelColor, TitelBgr, BanTop, BanTopPos, BanBot, BanBotPos, Msg, MsgColor, MsgBgr, MsgPos, MsgFont, Img, ImgPos, StartDate, EndDate, FreqDate, Time)" &_ 
      "VALUES (@Titel, @TitelColor, @TitelBgr, @BanTop, @BanTopPos, @BanBot, @BanBotPos, @Msg, @MsgColor, @MsgBgr, @MsgPos, @MsgFont, @Img, @ImgPos, @StartDate, @EndDate, @FreqDate, @Time)"

[ Voor 39% gewijzigd door intrix op 04-02-2004 15:35 ]

welcome my son, welcome to the machine


  • intrix
  • Registratie: November 2002
  • Laatst online: 04-12-2023
Net even zitten lezen, maar snap het nog niet helemaal
Whoami heb jij misschien beetje extra uitleg voor me??

Of iemad anders natuurlijk ..

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<%@LANGUAGE="VBSCRIPT" CODEPAGE="1252"%>
<!-- #INCLUDE FILE="datastore.inc" -->
<!-- #INCLUDE FILE="..\..\..\i&ascripts\adovbs.inc" -->
<%  
server.scripttimeout=15

Dim DbConn
Dim Sql 

If Request("button") = "opslaan" Then

 Set DbConn = Server.CreateObject("Adodb.Connection")

Sql = "INSERT INTO bericht (Titel, TitelColor, TitelBgr, BanTop, BanTopPos, BanBot, BanBotPos, Msg, MsgColor, MsgBgr, MsgPos, MsgFont, Img, ImgPos, StartDate, EndDate, FreqDate, Time)" &_ 
      "VALUES (@Titel, @TitelColor, @TitelBgr, @BanTop, @BanTopPos, @BanBot, @BanBotPos, @Msg, @MsgColor, @MsgBgr, @MsgPos, @MsgFont, @Img, @ImgPos, @StartDate, @EndDate, @FreqDate, @Time)"

<-- PROBLEEM GEDEELTE -->
SqlCommand1.CommandText = sSQL;

SqlCommand1.Parameters.Add ("@Titel", SqlDbType.Varchar);
SqlCommand1.Parameters.Add ("@TitelColor", SqlDbType.Varchar);

SqlCommand1.Parameters["@Titel"].Value = txtNaam.Text;
SqlCommand1.Parameters["@TitelColor"].Value = txtVoornaam.Text;
<-- PROBLEEM GEDEELTE -->

 DbConn.Open strConnect     
 Response.Write Sql
 DbConn.Execute Sql  
 DbConn.Close                

 Set RsMailList = Nothing
 Set DbConn = Nothing

End If

Response.Write Sql

%>

welcome my son, welcome to the machine


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Ik heb gezegd (en het staat in dat FAQ stukje ook), dat die syntax enkel voor .NET geldt.
De juiste syntax in ASP 3.0 zal je ff moeten opzoeken.

Het komt erop neer dat je daar vraagtekens als placeholders moet gebruiken.
De objecten SqlCommand, SqlDbType, etc.... bestaan niet in ASP 3.0

Het voordeel van parametrized queries is dat het sneller is, dat je geen problemen hebt met escapen, en dat je geen sql injection attacks hoeft te vrezen.

https://fgheysels.github.io/


  • intrix
  • Registratie: November 2002
  • Laatst online: 04-12-2023
whoami schreef op 04 februari 2004 @ 15:50:
Ik heb gezegd (en het staat in dat FAQ stukje ook), dat die syntax enkel voor .NET geldt.
De juiste syntax in ASP 3.0 zal je ff moeten opzoeken.

Het komt erop neer dat je daar vraagtekens als placeholders moet gebruiken.
De objecten SqlCommand, SqlDbType, etc.... bestaan niet in ASP 3.0

Het voordeel van parametrized queries is dat het sneller is, dat je geen problemen hebt met escapen, en dat je geen sql injection attacks hoeft te vrezen.
Voor de mensen die hierna ooit dit topic terug lezen:

http://www.4guysfromrolla.com/webtech/111798-1.shtml

hier kan je uitleg vinden, ga nu zelf ook even dit topic doorworstelen

HAPPY PROGRAMMING :P

offtopic:
misschien was ik iets te enthousiast met deze reactie, want ik snap zelf niet veel van de uitleg die ik daar krijg :S

[ Voor 9% gewijzigd door intrix op 06-02-2004 08:51 ]

welcome my son, welcome to the machine

Pagina: 1