Toon posts:

ASP.net INSERT autonummering Access DB (OLEdb)

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo,

ik ben al een tijdje bezig met het mijzelf aanleren van de taal asp.net; en nu ben ik dan eindelijk (voor de eerste keer) door het boek basiscursus asp.net van Peter Kassenaar heen. Nu ik echter alleen zelf iets wil maken kom ik met dat boek en het internet in mijn hand, niet echt erg ver.

Ik heb opzich wel vrij veel ervaring met php/mysql, dus dacht dat asp.net vrij snel aan te leren zou zijn, maar dat valt me tot nu toe enigszins tegen (maar miss. gaat het straks heel snel).

Wat ik wil is werken met een .mdb bestand als database, en simpel via een webformuliertje (die ik met webcontrols heb gemaakt) deze .mdb file vullen. Moet niet moeilijk zijn hierover staat voldoende op het internet. Dat klopt en dat lukt me dus ook wel. Wat me alleen niet lukt is zorgen dat de autonummering (zoals dat in access heet) en zoals ik dat gewend ben in phpMyAdmin (auto_increment) werkt. Ik heb dus het formulier, en daarvoor heb ik de volgende procedure geschreven...

ASP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<%@ Page Language="VB" debug="true" validateRequest=false%>
<%@ import Namespace="System.Data.OleDb" %>

<script runat="server">

Sub Button1_Click(Byval S As Object, ByVal e As EventArgs)
Dim strConn As String = "Provider=Microsoft.Jet.OLEDB.4.0; Data source=d:\www\happietariagronin.nl\database\rr.mdb;"

title.Text= Replace(title.Text, "'", "''")
Dim cmd As New OleDbCommand("INSERT INTO researchreport VALUES('" & title.Text & "','" & researchers.Text & "','" & shortdescription.Text & "','" & practicalrelevance.Text & "','" & timing.Text & "','" & status.Text & "','" & output.Text & "','" & cooperation.Text & "','55555')", New OleDbConnection(strConn))
cmd.Connection.Open()
cmd.ExecuteNonQuery()
cmd.Connection.Close()

End Sub
</script>

Het gaat even om de INSERT query.
Eerst even mijn database model: erg simpel (nog): alle velden zijn van het type tekst, behalve het veld 'id'. Die is van het type AutoNummering (zoals ik dat in Access XP heb ingesteld). Dat bestand heb ik naar de database map geupload, en dan beginnen de problemen.

in php icm mysql zou ik in mijn insert query het veld voor auto_increment leeglaten. SQL zorgt er dan zelf voor dat dit veld een waarde krijgt; namelijk 1 nummer hoger dan het vorige record. In de geposte query heb ik als laatste veld een willekeurig getal (55555) ingevuld. Als ik dat doe, gaat de insert query 1x (en niet vaker) volledig goed. Formulierteksten komen door, en het id ook. Laat ik het ID in de scriptcode leeg (ook bij een lege database of bij een database met 1 of meerdere records) dan krijg ik een foutmelding.

foutmelding die ik dan krijg
code:
1
2
3
4
Data type mismatch in criteria expression. 
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.Data.OleDb.OleDbException: Data type mismatch in criteria expression.

Die 55555 laat ik dan weg en is het veld id dus als '' ingevuld (twee hoge komma's).

Mijn vraag is simpel: hoe zorg ik dat de AutoNummering werkt (zonder select query van wat het hoogste id is van een record uit de tabel en 1 op te tellen). Of kan dat niet?

Nu moet ik telkens 'hardcoded' het id veranderen anders geeft het script bij de 2e insert van het formulier, de genoemde foutmelding.

Graag hoor ik uw reacties over wat ik over het hoofd zie dan wel anders moet doen.

Goede verwijzingen naar documentatie over dit probleem (dat ik relatief schaars vind op het internet) is meer dan welkom.

[ Voor 8% gewijzigd door Verwijderd op 16-01-2005 00:19 ]


  • pistole
  • Registratie: Juli 2000
  • Laatst online: 12-05 22:11

pistole

Frutter

volgens mij is de oplossing er simpel en had je die met mysql+php ervaring ook kunnen weten: gebruik een veld-lijst bij je insert.

BV:
code:
1
INSERT INTO table (field1, field2) VALUES (value1, value2)


Je specificeert dan dus niet je identity kolom; dat laat je aan de database over.
Nu moet ik telkens 'hardcoded' het id veranderen anders geeft het script bij de 2e insert van het formulier, de genoemde foutmelding.
Dit duidt erop dat je niet eens gebruik maakt van een autonumber in Access? (of mag je standaard een identity insert doen in access....)

[ Voor 33% gewijzigd door pistole op 16-01-2005 00:31 ]

Ik frut, dus ik epibreer


Verwijderd

Topicstarter
pistole schreef op zondag 16 januari 2005 @ 00:29:
volgens mij is de oplossing er simpel en had je die met mysql+php ervaring ook kunnen weten: gebruik een veld-lijst bij je insert.
Euh ik hoop dat de oplossing idd simpel is, maar volgens mij is de oplossing niet deze.

Aanpassing van de query waardoor de query zo is:
INSERT INTO researchreport (title, researchers, shortdescription, practicalrelevance, timing, status, output, cooperation, id) VALUES('a','b','c','d','e','f','g','h', 346326)
(overigens; volgens mij moet je integers niet single-quoten in sql, dus vandaar deze query. wel quoten leverde ook geen resultaat)
(deze query heb ik in het aspx script in beeld gebracht; dus variabelen komen goed door...)
Deze query geeft als fout:
Exception Details: System.Data.OleDb.OleDbException: Syntax error in INSERT INTO statement. (dat zou eventueel kunnen zitten in het WEL invullen van het id terwijl je autonummering hebt) dus poging waarvan ik zou verwachten dat het moet werken:
INSERT INTO researchreport (title, researchers, shortdescription, practicalrelevance, timing, status, output, cooperation, id) VALUES('a','b','c','d','e','f','g','h', '')

Dit levert ook een foutmelding op: Exception Details: System.Data.OleDb.OleDbException: Syntax error in INSERT INTO statement.

Beide queries kan ik in phpmyadmin zonder problemen draaien (maar ja ik wil niet in php/mysql werken maar in aspx / .mdb database...
pistole schreef op zondag 16 januari 2005 @ 00:29:

BV:
code:
1
INSERT INTO table (field1, field2) VALUES (value1, value2)


Je specificeert dan dus niet je identity kolom; dat laat je aan de database over.

[...]

Dit duidt erop dat je niet eens gebruik maakt van een autonumber in Access? (of mag je standaard een identity insert doen in access....)
Ik heb autonumber wel aanstaan (zie plaatje)
Het ziet er zo uit als ik het in access open...

Afbeeldingslocatie: http://www.rpostma.com/plaatjes/rr.jpg

Omdat het leeglaten van het id veld in de INSERT query niet werkte, heb ik geprobeerd deze in te vullen, om dan te kijken of het wel werkt. Dat deed het helaas niet :(.

Hoe breng ik in asp.net in beeld welke fout sql ziet? (iets als in php; if(!mysql_query($query)){echo mysql_error();}

[ Voor 29% gewijzigd door Verwijderd op 16-01-2005 01:13 ]


Verwijderd

Topicstarter
Reden dat ik de veldnamen eerst wegliet is omdat je vanalles probeert. Daarbij valt me dit op

Dim query = "INSERT INTO researchreport (title, researchers, shortdescription, practicalrelevance, timing, status, output, cooperation, id) VALUES('" & title.Text & "','" & researchers.Text & "','" & shortdescription.Text & "','" & practicalrelevance.Text & "','" & timing.Text & "','" & status.Text & "','" & output.Text & "','" & cooperation.Text & "', '444')"

geeft altijd sql error (ookal laat ik 444 weg, met of zonder singlequotes). -->sql errors zoals weergegeven hierboven).

Dim query = "INSERT INTO researchreport VALUES('" & title.Text & "','" & researchers.Text & "','" & shortdescription.Text & "','" & practicalrelevance.Text & "','" & timing.Text & "','" & status.Text & "','" & output.Text & "','" & cooperation.Text & "', '444')"

->gaat wel goed als je het getal invult. ook maar 1x, want dan krijg je een melding van dubbele items wat hij niet wil maken. 444 weghalen (met of zonder singlequotes die achterblijven) betekent dat het niet meer werkt.
fout dan: weer sql error in insert into.

Wat zie ik over 't hoofd?

  • pistole
  • Registratie: Juli 2000
  • Laatst online: 12-05 22:11

pistole

Frutter

Verwijderd schreef op zondag 16 januari 2005 @ 01:07:
[...]
Exception Details: System.Data.OleDb.OleDbException: Syntax error in INSERT INTO statement.
duidelijk dus een syntax fout. Controleer het; plak de query in de "query editor" van access.
INSERT INTO researchreport (title, researchers, shortdescription, practicalrelevance, timing, status, output, cooperation, id) VALUES('a','b','c','d','e','f','g','h', 346326)
Je moet de "id" kolom dus weglaten in zowel de veldlijst als de waardelijst.

En om "in beeld te brengen" wat er fout gaat: bovenstaande foutmelding zegt genoeg, dacht ik zo?

Tip: zet een breakpoint, en kijk welke query je daadwerkelijk uitvoert.

Ik frut, dus ik epibreer


Verwijderd

Topicstarter
query
INSERT INTO researchreport (title, researchers, shortdescription, practicalrelevance, timing, status, output, cooperation) VALUES('a','b','c','d','e','f','g','h')
had ik nog niet uitgeprobeerd, maar werkt ook niet. Weer fout in insert query.

ik ben nu enorm aan 't googlen 'query editor' ? Zo thuis ben ik niet in access :/
Heb ik office niet max. geinstalleerd? Of is het een add-in?

ik kan namelijk nergens vinden in access waar ik een query kan uitvoeren op de geopende db...

k zal ff goed zoeken nu...

  • pistole
  • Registratie: Juli 2000
  • Laatst online: 12-05 22:11

pistole

Frutter

kan ook niet "echt". Vanuit het "hoofdscherm" kan je "queries" bouwen - daarin zit een sql editor. Erg beperkt; dat wel.

Ik weet niet hoe het in het nederlands heet...

Ik frut, dus ik epibreer


Verwijderd

Topicstarter
Ok, een van je tips heeft geholpen.

Ik kon zojuist (MET autonummering) de volgende query uitvoeren
INSERT INTO researchreport (title) VALUES ('"&title.Text&"')

Nu ga ik ff de query uitbouwen, en kijken waarom de voorgaande queries niet lukten. Het zal idd dan toch een klein foutje ergens zijn. Bedankt i.i.g.; ik had er echt al een tijd aan gezeten (terwijl het in feite een simpele handeling is...).

#edit: is voor mij toch een beetje lastig achterhalen. Misschien toch een slordigheidje oid...
:oops:

Bedankt voor het helpen oplossen...

[ Voor 19% gewijzigd door Verwijderd op 16-01-2005 02:13 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:13
Je kan het id van het net geinserte record ook achterhalen door een select @@identity te doen na je insert.

Check trouwens ook dit eens, want je queries zijn nu niet bepaald onderhoudbaar en veilig.

https://fgheysels.github.io/


  • pjonk
  • Registratie: November 2000
  • Laatst online: 29-12-2025
whoami schreef op zondag 16 januari 2005 @ 10:28:
Je kan het id van het net geinserte record ook achterhalen door een select @@identity te doen na je insert.

Check trouwens ook dit eens, want je queries zijn nu niet bepaald onderhoudbaar en veilig.
Is een goeie, maar je kan ook gewoon gebruik maken van de AddNew method van de ADODB.Recordset. Dan zit je niet te klooien met dynamische SQL statements en hoef je je niet druk maken over het escapen van single quotes. Voor een voorbeeld, zie:
http://msdn.microsoft.com...o270/htm/mdmthaddnewx.asp

edit:
Zie dat je gebruik maakt van .net, maar die code zou je eenvoudig moeten kunnen porten

[ Voor 8% gewijzigd door pjonk op 16-01-2005 10:40 ]

It’s nice to be important but it’s more important to be nice


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:13
JonkieXL schreef op zondag 16 januari 2005 @ 10:35:
[...]

Is een goeie, maar je kan ook gewoon gebruik maken van de AddNew method van de ADODB.Recordset. Dan zit je niet te klooien met dynamische SQL statements en hoef je je niet druk maken over het escapen van single quotes. Voor een voorbeeld, zie:
http://msdn.microsoft.com...o270/htm/mdmthaddnewx.asp

edit:
Zie dat je gebruik maakt van .net, maar die code zou je eenvoudig moeten kunnen porten
Dat heb je niet in .NET, tenzij je met DataSets /DataTables gaat werken, daar een nieuwe DataRow aan toevoegt, en dan moet je toch nog via de DataAdapter de wijzigingen gaan persisten naar de databank, en in die DataAdapter moet je dan toch parametrized INSERT / UPDATE / DELETE / SELECT queries gaan schrijven.
Kortom: .NET != asp, vb6, oid.

https://fgheysels.github.io/

Pagina: 1