12. november 2008 - 13:47Der er
19 kommentarer og 2 løsninger
update sql virker ikke på iis7, men virker godt hos min host.
Jeg er løbet ud et lidt af problem. Jeg skal have opdateret en værdi en access database, når jeg kører sql strengen, får jeg bare en fejl:
Microsoft OLE DB Provider for ODBC Drivers error '80004005' [Microsoft][ODBC Microsoft Access Driver] Operation must use an updateable query. /admin/update.asp, line 17
Det underlige er at når jeg uploader hjemmesiden på min host (cliche.dk) virker koden godt. Jeg har snakket med support hos den anden host, og de mener det er fordi jeg ikke "lukker" for forbindelsen til databasen.
Neden under er kildekoden for den fil som giver fejlen.
Mød en af Nordens fremmeste eksperter i adfærdsdesign – Morten Münster, der bl.a. har skrevet ” Jytte fra marketing er desværre gået for i dag” – på Computerworld Cloud & AI Festival.
Jeg tror du skal finde en connectionstring som er mere "up to date" (kig evt. på www.connectionstrings.com for at finde en til den Access-version du kører på).
Hov! En anden ting du også skal have kontrolleret er at du har skriverettigheder til den mappe hvor databasen ligger (dvs. brugeren "network services" på serveren skal have adgang til at læse, skrive og modificere i den mappe).
Lugter meget af at IIS brugeren ikke har rettighed til at skriverettighed til DB'en, men det lyder underligt at en host skulle have det problem, men det kan jo ske. Har du bedt dem undersøge det??
fennec >> hmm... jeg synes da ikke darkskies flash adresserer rettighedsproblemet for en webserver. At give alle rettigheder til at skrive i databasen er vist at skyde med spredhagl :-)
softspot >> Plejer jeg også at kommentere, men hans video viser de grundlægende ting. At man så burde have brugt IUSR_maskinnavn brugeren i stedet er noget andet. Valgte dog at lade være at kommentere denne gang, da det er en Host, som har problemet. Videoen var bare en ekstra information...
Det med skrive rettigheder på databasen var også min første tanke. Googler man i øvrigt fejlen så er størstedelen af resultaterne relateret til skrive rettigheder.
Svaret jeg fik fra supporteren var dette: "Det beskriver, sker kun fordi der ikke bliver lukket rigtigt af til databasen når du har udført forespørgsel.... og nej den er ikke låst"
..med hensyn til connectionstrings, hvad vil I anbefale ? jeg bruger Access 2007, men gemmer i det ældste format programmet understøtter (mener det er access 2002)
>>michael Copy-paste fejl: update grunde set status = 3, pris = '645.000', storrelse = 1007, beskrivelse = 'Henrik Madsen 66146566/27875416' where grund = 2
Problemet kan måske opstå, hvis der sker en fejl på siden INDEN forbindelsen bliver lukket (så access efterlader sin lock-fil og dermed spærrer for andre brugere). Derfor er det en god idé at sikre sig, at conn.close bliver kaldt. Dette kan f.eks. gøres ved at lægge fejlhåndtering omkring koden der udfører databasehandlinger, således linien med conn.close nåes inden siden afslutter.
En anden metode er at lave en class som man opretter en instans af når man skal bruge sin connection. Denne class skal så sørge for at lukke forbindelsen i sit terminate-event. Dette vil langt de fleste gange redde en ellers efterladt forbindelse. Dette kan f.eks. se således ud:
class connWrapper private m_connStr private m_conn
private sub class_initialize() m_connStr = "DIN CONNECTIONSTRING" if m_conn is nothing then set m_conn = Server.CreateObject("ADODB.Connection") m_conn.open m_connStr end if end sub
private sub class_terminate() if not m_conn is nothing then if m_conn.state <> adStateClosed then m_conn.close end if end if end sub
public property get conn set conn = m_conn end property end class
dim connWrap, conn set connWrap = new connWrapper set conn = connWrap.conn
' udfør en sql-sætning som giver en fejl sql = "SELECT * FROM t WHERE a = " conn.execute sql
' kode herefter burde ikke blive udført, men i og med forbindelsen er pakket ' ind i en class som terminerer sig selv når den går ud af scope (dvs. siden ' afslutter), så burde den bliver lukket alligevel...
conn.close set conn = nothing set connWrap = nothing
Metoden er afhængig af at den simulerede COM-logik for VBS-klasser rent faktisk fungerer som den skal, så man kunne frygte at det glipper under visse omstændigheder. Jeg har dog benyttet denne metode i lang tid og har ikke bemærket nogle problemer indtil videre...
Det viste sig at være databasen som var skrivebeskyttet. Hvordan fordeler vi points ? softspot & fennec var praktisk talt samtidig med det korrekte svar.
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.