Avatar billede martin_moth Mester
25. april 2003 - 15:22 Der er 32 kommentarer og
2 løsninger

Opdater DB => Operation must use an updateable query

Jeg har en database på en server, som jeg vil opdatere via asp. Jeg tjekker, om en emailadresse allerede findes i databasen - gør den ikke, oprettes en ny bruger med email, navn, efternavn osv. Findes den derimod allerede, opdateres blot fornavn, efternavn osv.

Min kode (udpluk) ('Recievedeforename' osv. er variabler der indeholder det der skal indsættes i databasen):

Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "Provider=Microsoft.Jet.OleDb.4.0;Data Source=" & server.MapPath("../database/brugere.mdb")
strSQL = "SELECT * FROM Brugere WHERE BrugerEmail = '" & Recievedemail & "'"
Set rs = Conn.Execute(strSQL)

If rs.EOF Then
  'OPRET bruger - email findes IKKE i databasen i forvejen
  strSQL = "INSERT INTO Brugere (BrugerFornavn, BrugerEfternavn, BrugerEmail, BrugerPostnummer, BrugerAktiv) "
  strSQL = strSQL & "VALUES('" & Recievedeforename & "','" & Recievedelastname & "','" & Recievedemail & "','" & Recievedpostnumber & "',True)"
  Conn.Execute(strSQL)
Else
  'OPDATER bruger - email FINDES i databasen i forvejen
  RecordID = rs("Id")
  strSQL = "UPDATE Brugere Set "
  strSQL = strSQL & "BrugerFornavn='" & Recievedforename & "',"
  strSQL = strSQL & "BrugerEfternavn='" & Recievedlastname & "',"
  strSQL = strSQL & "BrugerPostnummer='" & Recievedpostnumber & "'"
  strSQL = strSQL & " WHERE Id=" & RecordID
  Conn.Execute(strSQL)
End If

Den går kold i Conn.Excecute(strSQL), uanset om det er UPDATE eller INSERT INTO. Fejlen: "Operation must use an updateable query."

Men den mappe databasen ligger i er IKKE skrivebeskyttet - hvad er der så galt?

Jeg kan se, at når jeg kører min asp-fil, genereres en  brugere.ldb-fil, så der sker da noget... Hmmmm?
Avatar billede ellebaek Nybegynder
25. april 2003 - 15:25 #1
det er fordi du ikke har skriverettigheder til din database...
Skriv til din webmaster og bed ham give dig tilladelse til at skrive til databsen...
Avatar billede martin_moth Mester
25. april 2003 - 15:27 #2
Prøv at læs de sidste to linier i mit spørgsmål
Avatar billede ellebaek Nybegynder
25. april 2003 - 15:28 #3
eller også er det fordi IUSR ikke må skrive til din database..
giv alle brugere skriverettigheder til databasen...

højreklik på db\'en, vælg properties, vælg fanebladet security og giv 'everybody' 'write' adgang til din db
Avatar billede eagleeye Praktikant
25. april 2003 - 15:40 #4
Bruger du XP?
Avatar billede martin_moth Mester
25. april 2003 - 15:49 #5
Jeg har ftp-adgang til en IIS-server hos et firma - det er ikke en lokal IIS server på min egen PC. Jeg har ringet til udbyderen og bedt ham gøre mappen databasen ligger i til read/wtire/execute. Han har FORSIKRET mig, at IUSER nu har read/write/execute

databasen er lavet i access på min lokale pc og uploadet til ovenstående mappe

Der dannes en .ldb-fil når jeg forsøger at skrive til databasen via min asp-side, men der bliver ikke skrevet noget, og den omtalte fejl opstår...

Kan det være fordi at databasen automatisk bliver gjort skrivebeskyttet når jeg uploader den - eller hva?
Avatar billede martin_moth Mester
25. april 2003 - 15:54 #6
Hvis jeg fra min ftp-adgang (der etableres ved at skrive ftp fra commandprompten i win) skrifer "dir" kan jeg se attributterne på databaseb: de er
-rwxrwxrwx (som sikkert betyder read write execute, formoder jeg)
Avatar billede martin_moth Mester
25. april 2003 - 16:28 #7
Anyone - hvad skal jeg gøre for at få det til at virke?
Avatar billede martin_moth Mester
25. april 2003 - 18:40 #8
Microsoft skriver:

http://support.microsoft.com/default.aspx?scid=http://support.microsoft.com:80/support/kb/articles/q175/1/68.asp&NoWebContent=1

Punkt 1 forstår jeg ikke - er det noget min webhoteludbyder skal sørge for? Og er det mon løsningen, eller?
Avatar billede martin_moth Mester
25. april 2003 - 18:43 #9
ellebaek - du skriver:

højreklik på db\'en, vælg properties, vælg fanebladet security og giv 'everybody' 'write' adgang til din db

Er det noget der skal gøres på serveren (altså noget min udbyder skal sørge for? For du mener vel ikek det skal gøres fra stifinderen før jeg uploader databasen, eller?
Avatar billede eagleeye Praktikant
25. april 2003 - 19:06 #10
Punkt 1. Ja det er din web udbyder som gør det. Og du har skrevet han har gjort det "Han har FORSIKRET mig, at IUSER nu har read/write/execute".
Avatar billede eagleeye Praktikant
25. april 2003 - 19:10 #11
Du kan prøve som punkt 2 forslår tilføje denne linje:
Conn.Mode = 3


Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Mode = 3
Conn.Open "Provider=Microsoft.Jet.OleDb.4.0;Data Source=" & server.MapPath("../database/brugere.mdb")
Avatar billede martin_moth Mester
25. april 2003 - 19:56 #12
eagleeye: Jeg har forsikret mig at MAPPEN er read/write, ellebaek taler om at selve DATABASEN skal være det. Og jeg har sat Conn.Mode = 3, det hjælper ikke :o(
Avatar billede eagleeye Praktikant
25. april 2003 - 20:17 #13
Ja det skal selv database filen også være. Hvis du højre klikker på den og sikre filen ikke er readonly så skulle der ikke være noget problem med den. Den status skulle ikke ændre sig når man uploader filen.
Avatar billede sekt Nybegynder
25. april 2003 - 20:29 #14
i ASP 3.0 programmer's Reference, Kapitel 27 , The Connection Object
skrives " The Recordset object that is returned has a read-only, forward-only cursor associated with it". jeg tror det er svaret på dit problem.
Du må bruge en "Open Method" hvis du skal have skrive rettigheder.
Avatar billede martin_moth Mester
25. april 2003 - 21:00 #15
sekt: Ikke forstået - min kode er hel gængs standard - hvad mener du jeg skal gøre? "Open method"...?
Avatar billede martin_moth Mester
25. april 2003 - 21:01 #16
sekt: Jeg skriver jo netop Conn.Open...
Avatar billede sekt Nybegynder
25. april 2003 - 21:14 #17
Når du opretter dit recordset med "Conn.Execute(strSQL)" kan du ikke skrive til det. Det er udmærket hvis du kun skal generer output.
Avatar billede eagleeye Praktikant
25. april 2003 - 21:19 #18
Han bruger ikke rs.AddNew for at ligge en ny i men bruger en connection Conn til at udføre en INSERT/UPDATE SQL...: Conn.Execute(strSQL)
Avatar billede sekt Nybegynder
25. april 2003 - 21:46 #19
OK du fik mig.
Execute Method: Conn.Execute(CommandText,[RecordsAffected],[Options])
CommandTypeEnum: adCmdText (1) Indicate that the provider should evaluate CommandText as textual definition of a command, such as a SQL statement.
Default er adCmdUnspecified (-1) The command type is unspecified

Jeg ved ikke om ovenstående kan hjælpe
Avatar billede sekt Nybegynder
25. april 2003 - 21:49 #20
Jeg har fundet dette eksemple:  "objComm.CommandType=adCmdText"

<%
  Option Explicit
  Dim strConnect
%>
<!-- #include file="DataStore.asp" -->
<!-- METADATA TYPE="typelib"
              FILE="C:\Program Files\Common Files\System\ado\msado15.dll" -->
<HTML>
<HEAD>
<TITLE>Using SQL's UPDATE Command and the ADO Command Object</TITLE>
</HEAD>
<BODY>
<%
  Dim objComm, intNoOfRecords
  Set objComm = Server.CreateObject("ADODB.Command")

  Response.Write "<B>Harry the Ham directs Tarantino films? </B><BR>"
  objComm.ActiveConnection = strConnect
  objComm.CommandText="UPDATE AllMovies SET Director = 'Harry the Ham' " & _
                      "WHERE Director LIKE 'Quentin Tarantino'"
  objComm.CommandType=adCmdText
  objComm.Execute intNoOfRecords
  Response.Write "This UPDATE command has affected " & _
                  intNoOfRecords & " records<BR><BR>"

  Response.Write "<B>Tarantino returned to his rightful place as director:</B> <BR>"
  objComm.CommandText="UPDATE AllMovies SET Director = 'Quentin Tarantino' " & _
                      "WHERE Director LIKE 'Harry the Ham'"
  objComm.Execute intNoOfRecords
  Response.Write "This UPDATE command has affected " & _
                  intNoOfRecords & " records<BR><BR>"
  Set objComm = Nothing
%>
</BODY>
</HTML>

Håber det kan hjælpe
Avatar billede martin_moth Mester
26. april 2003 - 00:09 #21
Nu har jeg taget "min" måde at gøre det på direkte fra pålidelige tutorials (www.w3schools.com), og synes ikke umiddelbart løsningen er at lave det hele om igen - jeg ser min kode som 100% korrekt, og søger fejlen for at det ikke virker (og løsningen på fejlen), ikke en alternativ løsning (men ellers tak :o)
Avatar billede sekt Nybegynder
26. april 2003 - 09:40 #22
Jeg ser ikke nogen grund til at du skal lave din løsning om , du mangler bare
at sætte CommandType til adCmdText (1). Det var det jeg ville vise dig med eksemplet fra min lærebog.
Avatar billede eagleeye Praktikant
26. april 2003 - 10:18 #23
Jeg kom lige til at tænke på en anden ting kunne det være at stien til databasen som ikke passer?? Men på den anden side så kunne du godt hendte fra DBen så stien må være rigtig. Kan du ikke skrive hele den fejl kode du får?
Avatar billede martin_moth Mester
26. april 2003 - 20:13 #24
Hmm - nu har jeg installeret IIS på min egen PC, og alle mine asp-sider fungerer PERFEKT, jeg kan sagtens skrive til databasen. Så kan fejlen næsten kun lægge hos udbyderen - men han har jo lovet mig, at mappen har skriveadgang for IUSER - hvad kan det så mon være?

Jeg mener - når det virker hos mig, skal jeg vel ikke lave min kode om - så er det vel blot et spørgsmål om at finde fejlen hos udbyderen - eller?
Avatar billede sekt Nybegynder
26. april 2003 - 22:04 #25
Hej Martin
har du prøvet at ændre din Execute statment til, "Conn.Execute(strSQL,,1)"
det ville være nemmere end at instalere IIS på din pc.
jeg tror du kommer til at vente længe, hvis du vil sende aben over til din udbyder.
Hvis du kommer med en e-mail adersse så vil jeg gerne sende dig access filen
fra det eksemple som jeg har fra min lærebog.
Avatar billede eagleeye Praktikant
27. april 2003 - 00:12 #26
Jeg tror nu martin_moth har ret i at fejlen er hos udbyderen. Hvis koden virker lokalt og du kan læse fra databasen hos udbyderen og fejlen siger "Operation must use an updateable query" så er det altså enten databasen som readonly (hvilket den nok ikke er) eller folderen som der ikke er skriverettighed i. Der skal også være rettigheder for ISUR at oprette filer i folderen da Access som du før har skrevet laver en temp fil.
Avatar billede eagleeye Praktikant
27. april 2003 - 00:14 #27
En ting du kan prøve er at ændre connection til denne, dog kun for test da OLE.DB driveren er bedre at bruge.:

Conn.open "Driver={Microsoft Access Driver (*.mdb)}; DBQ=" & server.MapPath("../database/brugere.mdb")
Avatar billede martin_moth Mester
27. april 2003 - 18:30 #28
Jeg takker indtil videre for at I gider tage jer tid til at hjælpe mig - nu snakker jeg med udbyderen i morgen, og ser om han kan løse problemet... (I skal nok få jeres velfortjente points)
Avatar billede the_bma_man Nybegynder
28. maj 2003 - 10:26 #29
Du fik ikke fat i udbyderen?
Hint: sidste indlæg fra dig er over en måned gammel. Måske spørgsmålet skulle lukkes? :-)
Avatar billede martin_moth Mester
28. maj 2003 - 10:43 #30
Sorry - min fejl. Alt virker nu, tak for udførlige svar :o)
Avatar billede sekt Nybegynder
28. maj 2003 - 10:53 #31
Martin

det vil være dejligt, for andre at kende årsagen til at det ikke virkede, og hvad du lavede for at få det til at virke

Svenn-Erik
Avatar billede martin_moth Mester
28. maj 2003 - 10:58 #32
Fejlen var hos udbyderen, som vi næsten allesammen blev enige om at det måtte være. Hvad de gjorde for at rette det ved jeg ikke. Men jeg ringede, beklagede mig, og få timer senere virkede det...
Avatar billede martin_moth Mester
28. maj 2003 - 11:00 #33
Men jeg lærte en hel masse undervejs, så det var bestemt ikke spildt ;o)
Avatar billede the_bma_man Nybegynder
13. juni 2003 - 16:32 #34
Tænkte nok, det bare var en "glemmer" :-)
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