25. april 2003 - 15:22Der 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?
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?
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)
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?
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(
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.
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.
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 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>
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)
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.
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?
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?
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.
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.
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)
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...
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.