Avatar billede joyzer Nybegynder
29. december 2007 - 15:14 Der er 25 kommentarer og
2 løsninger

Type mismatch

Jeg har en DB hvor i der er en hovedtabel, og 3 andre tabeller, som der så er relationer til. Jeg har ingen problemer med at oprette poster, men når jeg skal opdatere en post, får jeg følgende fejl:

Provider error '80020005'

Type mismatch.

I de tabeller hvortil jeg har relationer er der 2 felter, autonummering og et tekstfelt. Jeg kan godt få den til at udskrive det, som der er i databasen til en dropdown menu, som så også indeholder andre muligheder.

Håber min problemstilling er til at forstå =)
Avatar billede no_doubt Nybegynder
29. december 2007 - 15:15 #1
ofte kan det være en plinger fejl - tjek det
Avatar billede a1a1 Novice
29. december 2007 - 15:22 #2
evt. en dato?
Provider error '80020005'
Type mismatch.

This can happen if you try to set a date column to a value that is not in proper date format, e.g. "UPDATE tableName SET dateColumn='31/31/2002'"... it can also happen when using a command object and named constants (e.g. adDate and adLongVarChar); I will always recommend using a straight EXEC statement against a connection object, rather than go through the hassle and rigorous code required by an ADODB.Command object.

http://classicasp.aspfaq.com/general/why-do-i-get-80020005-errors.html
Avatar billede joyzer Nybegynder
29. december 2007 - 15:33 #3
@a1
Datoen bliver ikke skrevet i det tilfælde, og ej heller opdateret. Det sker kun i fm. oprettelse af posten.

@no_doubt
Med plinger, mener du ' eller " ?
Avatar billede a1a1 Novice
29. december 2007 - 15:36 #4
prøv at skrive din sqlsætning ud og skriv den her

;o)
Avatar billede joyzer Nybegynder
29. december 2007 - 15:39 #5
MyRS.open "sager where Id=" & request.QueryString("sletId"), Conn, 3,3,2

Udskriver jeg de data der er i querystring ser det korrekt ud. Tror det er som om den vil skrive noget tekst til autonummering ?
Avatar billede joyzer Nybegynder
29. december 2007 - 15:40 #6
MySQL1 = "Select sager.Id, sager.dato, sager.level, sager.farveValg, sager.show, sager.navn, sager.emne, sager.bodyText, sager.eta, sager.udbyder, sager.omraade, farver.farveID, farver.farveNavn, udbyder.udbyderID, udbyder.udbyderNavn FROM sager, farver, udbyder  WHERE sager.Farvevalg = farver.farveID AND sager.udbyder = udbyder.udbyderID AND sager.Id=" & Request.Querystring("sletId")

er fra den foregående side.
Avatar billede a1a1 Novice
29. december 2007 - 15:46 #7
prøv at skrive mySql1 ud (response.write(mysql1)

sager.id er vel et tal (int)?
Avatar billede joyzer Nybegynder
29. december 2007 - 15:50 #8
Giver følgende resultat:
Select sager.Id, sager.dato, sager.level, sager.farveValg, sager.show, sager.navn, sager.emne, sager.bodyText, sager.eta, sager.udbyder, sager.omraade, farver.farveID, farver.farveNavn, udbyder.udbyderID, udbyder.udbyderNavn FROM sager, farver, udbyder WHERE sager.Farvevalg = farver.farveID AND sager.udbyder = udbyder.udbyderID AND sager.Id=1

Og ja, det er fra autonummeringen i "hovedtabellen".
Avatar billede a1a1 Novice
29. december 2007 - 16:03 #9
du skriver opdatere? den sql "selecter"?

hvordan ser opdaterings sql ud?
Avatar billede joyzer Nybegynder
29. december 2007 - 16:07 #10
MyRS.open "sager where Id=" & request.QueryString("sletId"), Conn, 3,3,2

MyRS.update
MyRS("emne") = request.form("emne")
MyRS("bodyText") = request.form("bodyText")
MyRS("eta") = request.form("eta")
MyRS("navn") = request.form("navn")
MyRS("udbyder") = request.form("udbyderID")
MyRS("omraade") = request.form("omraade")
MyRS("farveValg") = request.form("farve")
MyRS("level") = request.form("levelNavn")
MyRS.update
Avatar billede a1a1 Novice
29. december 2007 - 16:18 #11
hmmm...

ser "sjovt" ud..(en gammel måde at opdatere sit recordset på)

hvorfor bruger du ikke "bare" en alm. sql sætning?

ala.

strSql = "update sager set emne='" & request.form("emne") & "', bodytext='" & request.form("bodytext") & "', osv osv; WHERE ID=" & request.querystring("id")
Avatar billede joyzer Nybegynder
29. december 2007 - 16:30 #12
tjah har nu altid virket for mig tidligere.

Har nu lavet denne:
strSql = "update sager set emne='" & request.form("emne") & "', bodytext='" & request.form("bodytext") & "', eta='" & request.form("eta") & "', navn='" & request.form("navn") & "', udbyderID='" & request.form("udbyderID") & "', omraade='" & request.form("omraade") & "', farve='" & request.form("farve") & "', levelNavn='" & request.form("levelNavn") & "'; WHERE ID=" & request.QueryString("sletId")


Får ingen fejl, men intet bliver opdateret i DB.
Avatar billede softspot Forsker
29. december 2007 - 17:46 #13
Det er ikke et spørgsmål om gammel eller ny, men snarere et spørgsmål om resurseforbrug. Din metode er væsentlig dyrere hvad angår resurseforbrug end den a1 foreslår, da din skal vedligeholde en cursor for at håndtere opdateringen. Det er ikke den foretrukne metode på en server der skal håndtere mange brugere på samme tid. Ud over det så burde den være lige så gyldig som enhver anden metode... :)

Jeg tror du får fejl i din nye version (den som a1 foreslår), fordi der er indsat et semikolon inden WHERE - det må der ikke være.

Har nu lavet denne:
strSql = "update sager set emne='" & request.form("emne") & "', bodytext='" & request.form("bodytext") & "', eta='" & request.form("eta") & "', navn='" & request.form("navn") & "', udbyderID='" & request.form("udbyderID") & "', omraade='" & request.form("omraade") & "', farve='" & request.form("farve") & "', levelNavn='" & request.form("levelNavn") & "' WHERE ID=" & request.QueryString("sletId")

En ting du så skal passe på med, når du bruger denne strengsammensætningsmetode til at opdatere data, er SQL-injections, dvs. hvor felterne indeholder tegn der kan "ødelægge" din SQL-sætning og indføre nye "features" (som typisk ikke er ønskelige for din applikation). Du bør i princippet checke ALLE felter for apostroffer og om typerne passer til de felter værdien indsættes i. For tekstfelter kan du redde meget ved at udskifte hver apostrof med 2 af slagsen. Altså f.eks. udskift forekomsten

request.form("bodytext")

med

replace(request.form("bodytext"), "'", "''")
Avatar billede a1a1 Novice
29. december 2007 - 18:00 #14
; deler din sqlsætning i 2, (injections, replace(field, "'","''") )

hvilken database bruge du?

hvis det er acces (gammel) skal du bruge #dato# ;o)
Avatar billede joyzer Nybegynder
30. december 2007 - 10:53 #15
Jeg bruger en access 2000/2003 DB. Og heldigvis er ressourcer ikke et problem i dette tilfælde =) men tak for informationen alligevel. Dog er jeg ikke kommet frem til et brugbart resultat endnu :(
Avatar billede softspot Forsker
30. december 2007 - 11:46 #16
Nu kender jeg i sagens natur ikke noget til de omstændigheder dit site kører under, men det er ALTID en god idé at vælge den mest optimale løsning ifht. resurseforbrug - hvem ved, det kan måske en dag blive relevant at sitet skalerer og så er det noget møg at have brugt en suboptimal metode 1000 steder i sin kode ;-)
Avatar billede softspot Forsker
30. december 2007 - 12:01 #17
"Dog er jeg ikke kommet frem til et brugbart resultat endnu"

Kan du ikke prøve at vise hele den kode du bruger til det opdatere med? Der må være andre årsager til at det ikke fungerer som ønsket...
Avatar billede joyzer Nybegynder
30. december 2007 - 12:17 #18
Selvfølgelig. Dog er jeg 110% sikker på, at dette _ikke_ skal udvides, men du har selvfølgeligt ret alligevel.

<%
Dim Conn, MyConnection, MySQL, MyRS
Set Conn = Server.CreateObject("ADODB.connection")
Set MyRS = Server.CreateObject("ADODB.Recordset")

MyConnection = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ="& Server.MapPath("se.mdb")
Conn.Open MyConnection

MyRS.open "sager where Id=" & request.QueryString("sletId"), Conn, 3,3,2

MyRS.update
MyRS("emne") = request.form("emne")
MyRS("bodyText") = request.form("bodyText")
MyRS("eta") = request.form("eta")
MyRS("navn") = request.form("navn")
MyRS("udbyder") = request.form("udbyderID")
MyRS("omraade") = request.form("omraade")
MyRS("farveValg") = request.form("farve")
MyRS("level") = request.form("levelNavn")
MyRS.update
%>
Avatar billede softspot Forsker
30. december 2007 - 17:50 #19
OK, men når du siger at du ikke er kommet frem til en brugbar løsning endnu, hvad er det så du søger siden det foreslåede ikke "har interesse"?

For mig at se burde dette da løse udfordringen med at opdatere data:

<%
Dim Conn, MyConnection, MySQL

MySQL = "UPDATE sager SET emne='" & request.form("emne") & "', [bodytext]='" & request.form("bodytext") & "', eta='" & request.form("eta") & "', navn='" & request.form("navn") & "', udbyderID='" & request.form("udbyderID") & "', omraade='" & request.form("omraade") & "', farve='" & request.form("farve") & "', levelNavn='" & request.form("levelNavn") & "' WHERE ID=" & request.QueryString("sletId")

MyConnection = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ="& Server.MapPath("se.mdb")

Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open MyConnection

Conn.Execute MySQL

Conn.Close
set Conn = nothing
%>
Avatar billede joyzer Nybegynder
30. december 2007 - 20:53 #20
Alt har skam interesse, og alt er forsøgt afprøvet.

Det forslag du netop kom med giver følgende fejlmelding:
Microsoft OLE DB Provider for ODBC Drivers error '80040e10'

[Microsoft][ODBC Microsoft Access Driver] Too few parameters. Expected 3.
Avatar billede softspot Forsker
30. december 2007 - 22:09 #21
Jamen, så er der et af felterne som enten er stavet forkert eller mangler i databasen. Har du kontrolleret dette?
Avatar billede softspot Forsker
30. december 2007 - 22:13 #22
Det kunne f.eks. være at felterne udbyderID, farve og levelNavn skulle hedde hhv. udbyder, farveValg og level i stedet...?
Avatar billede softspot Forsker
30. december 2007 - 22:14 #23
Altså:

MySQL = "UPDATE sager SET emne='" & request.form("emne") & "', [bodytext]='" & request.form("bodytext") & "', eta='" & request.form("eta") & "', navn='" & request.form("navn") & "', udbyder='" & request.form("udbyderID") & "', omraade='" & request.form("omraade") & "', farveValg='" & request.form("farve") & "', level='" & request.form("levelNavn") & "' WHERE ID=" & request.QueryString("sletId")
Avatar billede joyzer Nybegynder
03. januar 2008 - 20:03 #24
Har fixed det, dog ved at gå uden om brug af autonummering. Sætter dog pris på jeres input, så softspot & a1 smid et svar =)
Avatar billede softspot Forsker
03. januar 2008 - 21:22 #25
Kommer her :)
Avatar billede a1a1 Novice
03. januar 2008 - 21:58 #26
et svar ;o)
Avatar billede softspot Forsker
04. januar 2008 - 09:01 #27
Tak for point :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester