Avatar billede b-fix Nybegynder
12. november 2008 - 13:47 Der 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.

<%@ LCID = 1030 %>
<!--#include file="include/funktioner.asp" -->
<%
    Set Conn = Server.CreateObject("ADODB.Connection")
    DSN = "DRIVER={Microsoft Access Driver (*.mdb)}; "
    DSN = DSN & "DBQ=" & Server.MapPath("../db/findgrund.mdb")
    Conn.Open DSN

uPris = request.Form("pris")
uStorrelse = cint(request.Form("storrelse"))
uBeskrivelse = request.Form("beskrivelse")
uStatus = cint(request.Form("GrundStatus"))
gGrund = cint(request.Form("grundnr"))
strSQL = "update grunde set status = "&uStatus&", pris = '"&uPris&"', storrelse = "&uStorrelse&", beskrivelse = '"&uBeskrivelse&"' where grund = "&gGrund&""
response.Write(strSQL)

conn.execute(strSQL)
conn.Close
response.Redirect("default.asp")
%>

Håber en af Jer kan knække nøden :)
Avatar billede b-fix Nybegynder
12. november 2008 - 13:50 #1
Glemte lige dette:
<!--#include file="include/funktioner.asp" -->
Indeholder kun login check, så den er ikke relevant for fejlen.
Avatar billede michael_stim Ekspert
12. november 2008 - 13:52 #2
Hvad siger denne: response.Write(strSQL)

Du har ' der hvor det er strings?
Avatar billede softspot Forsker
12. november 2008 - 13:54 #3
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å).
Avatar billede b-fix Nybegynder
12. november 2008 - 13:57 #4
Michael: Den giver dette

update grunde set status = 3, pris = '645.000', storrelse = 1007, beskrivelse = 'Henrik Madsen 66146566/27875416' where grund =
Avatar billede michael_stim Ekspert
12. november 2008 - 13:59 #5
where grund =

Mangler der ikke noget her?
Avatar billede softspot Forsker
12. november 2008 - 14:02 #6
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).
Avatar billede fennec Nybegynder
12. november 2008 - 14:02 #7
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??

Darkskies har lavet en flash som viser løsningen (så du også ved hvad der skal gøres):
http://www.darkskies.dk/rettigheder.swf
Avatar billede michael_stim Ekspert
12. november 2008 - 14:03 #8
Tror softspot har fat i noget der. Længe siden jeg har siddet med Access ;o)
Avatar billede softspot Forsker
12. november 2008 - 14:08 #9
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 :-)
Avatar billede fennec Nybegynder
12. november 2008 - 14:12 #10
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...
Avatar billede michael_stim Ekspert
12. november 2008 - 14:13 #11
Det er netop lokalt han har problemet. Det virker hos hosten.
Avatar billede fennec Nybegynder
12. november 2008 - 14:37 #12
michael_stim >>
Det virker på den ene host. Ikke på den anden.

"...Jeg har snakket med support hos den anden host..."
Avatar billede michael_stim Ekspert
12. november 2008 - 14:41 #13
My bad. Havde ikke læst ordentligt.
Avatar billede b-fix Nybegynder
12. november 2008 - 17:00 #14
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
Avatar billede michael_stim Ekspert
12. november 2008 - 18:43 #15
Lyder mærkeligt:

conn.execute(strSQL)
conn.Close
set conn = Nothing
Avatar billede softspot Forsker
12. november 2008 - 19:12 #16
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...
Avatar billede b-fix Nybegynder
13. november 2008 - 11:59 #17
Jeg har lige prøvet følge Darkskies guide på min lokale arbejdsmaskine (vista business / iis7), og det løste problemet lokalt hos mig.

Sender guiden videre til supporteren, og forklare ham at han er nød til at prøve det samme på min database.
Avatar billede b-fix Nybegynder
14. november 2008 - 13:06 #18
Det viste sig at være databasen som var skrivebeskyttet. Hvordan fordeler vi points ? softspot & fennec var praktisk talt samtidig med det korrekte svar.
Avatar billede softspot Forsker
14. november 2008 - 13:26 #19
Jaman, så del dem lige over... :-)
Avatar billede fennec Nybegynder
17. november 2008 - 08:14 #20
.o) <--One Eyed Jack
Avatar billede softspot Forsker
18. november 2008 - 08:37 #21
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