Avatar billede Slettet bruger
05. oktober 2007 - 14:42 Der er 13 kommentarer og
1 løsning

Fejl i database efter update via ASP

Jeg har lige lavet et nyt "script" der håndtere avatars, men efter en/flere oprettede poster så er det umuligt at åbne tabelen i access, selv om det virker fint nok online. Jeg får fejlen: Databaseformatet ".../main.mdb" kan ikke genkendes.

Men hvis jeg reparere databasen, så opretter den en fejl-tabel med 3 poster og fejlne:
1611 - Felt 'Description' kunne ikke findes.
1053 - Felt 'Description' kunne ikke findes.
Og sys_avatars-tabelen kan nu åbnes, og man kan se hvor mange poster der har været, men al data er fjernet.

Jeg er ligeglad med hvordan man genskaber den tabte data, da det kun er en test database, men jeg vil gerne vide hvad der er skyld i nedbrudet og hvorfor der ikke er fejl online.

Her er koden der uploader og gemmer avatars:

    Dim UploadFiles
    Set UploadFiles = Server.CreateObject("aspSmartUpload.SmartUpload")
    UploadFiles.Upload

    For each file In UploadFiles.Files

      If not file.IsMissing Then

        If not Lcase(file.FileExt) = "jpg" Then
          Response.Redirect "?pa=" & Request.Querystring("pa") & "&upload=avatar&error=no_jpg"
        End If

        If Session("userrole") >= SITE_VARIABLE_APPROVEDATA Then
          approvedata = Session("userid")
        Else
          approvedata = 0
        End If

        If UploadFiles.Form("public") = "on" Then
          publicavatar = 1
        Else
          publicavatar = 0
        End If

        strSQL = "Insert into sys_avatars ("
        strSQL = strSQL & "[avaFilename], "
        strSQL = strSQL & "[avaSizeByte], "
        strSQL = strSQL & "[avaPublic], "
        strSQL = strSQL & "[avaAddedBy], "
        strSQL = strSQL & "[avaCheckedBy] ) "
        strSQL = strSQL & "Values ("
        strSQL = strSQL & "'" & Checkavatar(file.FileName) & "', "
        strSQL = strSQL & "" & file.Size & ", "
        strSQL = strSQL & "" & publicavatar & ", "
        strSQL = strSQL & "" & Session("userid") & ", "
        strSQL = strSQL & "" & approvedata & " ) "
        ConnMain.Execute(strSQL)
        SQL = "SELECT @@IDENTITY FROM sys_avatars"
        Set RS = ConnMain.Execute(SQL)
        avatarID = RS(0)
        strSQL = "Select * From sys_avatars Where avaID=" & avatarID & ""
        Set rsAvatar = ConnMain.Execute(strSQL)
        If Not (rsAvatar.EOF OR rsAvatar.BOF) Then
          file.SaveAs("" & GLOBAL_SITE_FOLDER & "/files/avatars/" & rsAvatar("avaFilename") & "")

          If SITE_VARIABLE_IMAGECOMPONENT = "aspimage" Then

            Dim objImage
            Dim strFileSource
            Dim strNewFile
            Dim intXSize
            Dim intYSize

            strFileSource = "" & GLOBAL_SITE_FOLDER & "/files/avatars/" & rsAvatar("avaFilename") & ""
            strNewFile = "" & GLOBAL_SITE_FOLDER & "/files/avatars/" & rsAvatar("avaFilename") & ""

            Set objImage = Server.CreateObject("AspImage.Image")
            objImage.LoadImage(Server.MapPath(strFileSource))

            filemaxwidth = 300
            filemaxheight = 300

            filewidth = objImage.MaxX
            fileheight = objImage.MaxY

            If Int(filewidth) >= Int(filemaxwidth) Then
              newwidth = filemaxwidth
              newheight = int(fileheight*(newwidth/filewidth))
            Else
              newwidth = filewidth
              newheight = fileheight
            End if

            filewidth = newwidth
            fileheight = newheight
         
            If Int(fileheight) >= Int(filemaxheight) Then
              newheight = filemaxheight
              newwidth = int(filewidth*(newheight/fileheight))
            End if

            filewidth = newwidth
            fileheight = newheight

            intXSize = filewidth
            intYSize = fileheight

            objImage.ResizeR intXSize, intYSize
            objImage.ImageFormat = 1
            objImage.FileName = Server.MapPath(strNewFile)
            objImage.SaveImage
            Set objImage = Nothing

          End If

        End If

      End If

    Next
Avatar billede softspot Forsker
05. oktober 2007 - 15:10 #1
Et par ting springer umiddelbart i øjnene.

Dels får du ikke lukket dine recordsets efter brug (RS som bu henter det nye ID med og rsAvatar som du henter filnavnet med), dels udvælges @@identity i access alene ved kommandoen

  select @@identity

altså uden specifikation af tabelnavnet (fordi @@identity er global for den aktuelle forbindelse).

Hvorfor dette skulle resultere i fejl er jeg usikker på, men hvis der er mange rækker vil du ende med en del recordsetobjekter som binder nogle resurser i databasen. Derfor bør du gøre det til en vane altid at lukke din recordsets efter brug.
Avatar billede Slettet bruger
05. oktober 2007 - 15:47 #2
Ja, men det burde da ikke ødelægge databasen...
Har lige lavet lidt tests på min side, hvis jeg tilføjer data med en alm. form så virker det fint nok, men alle mine koder, hvor bruger aspsmartupload, der virker tabellen ikke når jeg prøver at åbne med access, den virker selvfølgelig fint nok på nettet.
Jeg har brugt de koder før og da virkede det hele som det skulle også selv om jeg ikke lukker recordsets... Kan det have noget at gøre med at jeg har skiftet web-hotel? Havde et dansk før, og det nye køre vist med amerikans system (dato, tid og den slags)
Avatar billede softspot Forsker
05. oktober 2007 - 15:56 #3
Umiddelbart ville jeg synes det var sært hvis sproget skulle ødelægge databasen, så det tvivler jeg på er årsagen (men det er kun en overbevisning ikke et erfaringsbaseret faktum :)).

Er det en IIS det kører på og var det også det før. Man kunne forestille sig at den driver som hotellet har installeret ikke passer helt til databaseversionen, har et bug eller noget i den stil (jeg synes det lyder mere sandsynligt at problemet kunne ligger i det lag, specielt hvis systemet er blevet flyttet til SUN ASP fra IIS).
Avatar billede Slettet bruger
05. oktober 2007 - 16:02 #4
Ja, men det lyder mærkeligt at denne kode så virker, selv om den rent faktisk kunne være en kopi af den insert jeg har vist ovenfor!
Men kan da prøve at kontakt min nye udbyder en gang.

strSQL = "Insert into con_articles ("
strSQL = strSQL & "[artGroup], "
strSQL = strSQL & "[artTitle], "
strSQL = strSQL & "[artArticle], "
strSQL = strSQL & "[artSource], "
strSQL = strSQL & "[artAddedBy], "
strSQL = strSQL & "[artApprovedBy] ) "
strSQL = strSQL & "Values ("
strSQL = strSQL & "" & category & ", "
strSQL = strSQL & "'" & headline & "', "
strSQL = strSQL & "'" & article & "', "
strSQL = strSQL & "'" & source & "', "
strSQL = strSQL & "" & Session("userid") & ", "
strSQL = strSQL & "" & approvedata & " ) "
ConnMain.Execute(strSQL)
Avatar billede Slettet bruger
05. oktober 2007 - 16:10 #5
Hmm er lige blevet lidt mere forvirret, den avatar kode jeg viste er fra min nye side og den køre på et sub-domæne og den laver som sagt fejl... Men min aktive side (der køre på hoved-domæne) bruger en kode næsten magen til avatar-kode, men den virker 100% som den skal...

Har det noget med sub-domæner at gøre? Men ville det ikke lyde mærkeligt, hvis det havde!?

Her er den gamle kode som virker:

Dim UploadFiles
Set UploadFiles = Server.CreateObject("aspSmartUpload.SmartUpload")
UploadFiles.AllowedFilesList = LOCAL_SETTING_UPLOADONLY
UploadFiles.MaxFileSize = LOCAL_SETTING_MAXUPLOADSIZE
UploadFiles.Upload

For each file In UploadFiles.Files

  If not file.IsMissing Then

    If file.Name = "file" Then

      If UploadFiles.Form("newarchive") > "" Then
        archive = UploadFiles.Form("newarchive")
      Else
        archive = UploadFiles.Form("archive")
      End If

      strSQL = "Insert into con_files ("
      strSQL = strSQL & "[fileArchive], "
      strSQL = strSQL & "[fileTitle], "
      strSQL = strSQL & "[fileDescription], "
      strSQL = strSQL & "[fileFilename], "
      strSQL = strSQL & "[fileType], "
      strSQL = strSQL & "[fileSizeByte], "
      strSQL = strSQL & "[fileHiddenfolder], "
      strSQL = strSQL & "[fileAddedBy] ) "
      strSQL = strSQL & "Values ("
      strSQL = strSQL & "'" & Checkarchive(archive) & "', "
      strSQL = strSQL & "'" & Trim(Replace(UploadFiles.Form("title"),"'","''")) & "', "
      strSQL = strSQL & "'" & Trim(Replace(UploadFiles.Form("description"),"'","''")) & "', "
      strSQL = strSQL & "'" & checkfile(file.FileName) & "', "
      strSQL = strSQL & "'" & checkfiletype(file.FileName) & "', "
      strSQL = strSQL & "" & file.Size & ", "
      strSQL = strSQL & "'" & Hiddenfolder(Session("userid")) & "', "
      strSQL = strSQL & "" & Session("userid") & " ) "
      ConnMain.Execute(strSQL)
      SQL = "SELECT @@IDENTITY FROM con_files"
      Set RS = ConnMain.Execute(SQL)
      fileID = RS(0)
      strSQL = "Select * From con_files Where fileID=" & fileID & ""
      Set rsFile = ConnMain.Execute(strSQL)
      If Not (rsFile.EOF OR rsFile.BOF) Then
        If rsFile("fileHiddenfolder") > "" Then
          file.SaveAs("" & GLOBAL_SITE_FOLDER & "files/users/user_" & Session("userid") & "/" & rsFile("fileHiddenfolder") & "/" & rsFile("fileFilename") & "")
        Else
          file.SaveAs("" & GLOBAL_SITE_FOLDER & "files/users/user_" & Session("userid") & "/" & rsFile("fileFilename") & "")
        End If
      End If

    ElseIf file.Name = "thumbnail" Then

      strSQL = "Update con_files set "
      strSQL = strSQL & "[fileThumbnail]='" & checkthumb(file.FileName) & "' "
      strSQL = strSQL & "where fileID=" & fileID & " "
      ConnMain.Execute(strSQL)
      strSQL = "Select * From con_files Where fileID=" & fileID & ""
      Set rsFile = ConnMain.Execute(strSQL)
      If Not (rsFile.EOF OR rsFile.BOF) Then
      file.SaveAs("" & GLOBAL_SITE_FOLDER & "files/thumbnails/" & rsFile("fileThumbnail") & "")
      End If

    End If

  End If

Next
Avatar billede softspot Forsker
05. oktober 2007 - 16:11 #6
Jeg tror ikke så meget det er den enkelte SQL-sætning der er årsag til problemerne, men, som jeg var inde på tidligere, den kontekst hvori det bliver brugt.

Det er en kendt sag at COM kan give problemer, hvis man ikke sørger for at frigive de objekter man opretter, specielt i forbindelse med databaseopslag. Jeg synes under alle omstændigheder du skal tillægge dig den (gode) vane, eksplicit at frigive de resurser du lægger beslag på, for så er du i det mindste sikker på at du har gjort hvad du kunne... :)
Avatar billede softspot Forsker
05. oktober 2007 - 16:14 #7
Er der forskel på hvormange filer du uploader når det fungerer, eller er det altid en fil du uploader?
Avatar billede Slettet bruger
05. oktober 2007 - 16:18 #8
Det er lige meget hvor mange filer jeg uploader af gangen (har testet).

Nu må jeg indrømme at jeg aldrig får lukket mine recordsets, men det er vel bare sådan man lukker dem strSQL = Nothing eller er det kun en del af det ?
Avatar billede Slettet bruger
05. oktober 2007 - 16:47 #9
Har "løst" mysteriet, fejlen sker når man gør det fra sub-domæne, men da jeg overførste det hele til mit hoved-domæne så kunne jeg åbne alle tabeller uden problemer...
Avatar billede softspot Forsker
05. oktober 2007 - 16:54 #10
Det der er vigtigt at gøre er at kalde funktionen Close på det recordsetobjekt du får ud af et kald til connection.Execute. I dit tilfælde vil det altså betyde at du skal kalde RS.Close og rsAvatar.Close umiddelbart efter du er færdig med at bruge de respektive recordsets.

Eksempelvis kan følgende kodestump (fra din egen kode):

        SQL = "SELECT @@IDENTITY FROM sys_avatars"
        Set RS = ConnMain.Execute(SQL)
        avatarID = RS(0)
        strSQL = "Select * From sys_avatars Where avaID=" & avatarID & ""
        Set rsAvatar = ConnMain.Execute(strSQL)
        If Not (rsAvatar.EOF OR rsAvatar.BOF) Then
          file.SaveAs("" & GLOBAL_SITE_FOLDER & "/files/avatars/" & rsAvatar("avaFilename") & "")

          If SITE_VARIABLE_IMAGECOMPONENT = "aspimage" Then

            Dim objImage
            Dim strFileSource
            Dim strNewFile

            ' resten af billedebehandlingskoden...

          End if
        End if

resttes til:

        SQL = "SELECT @@IDENTITY FROM sys_avatars"
        Set RS = ConnMain.Execute(SQL)
        avatarID = RS(0)
        RS.close
        set RS = nothing

        strSQL = "Select * From sys_avatars Where avaID=" & avatarID & ""
        Set rsAvatar = ConnMain.Execute(strSQL)
        If Not rsAvatar.EOF Then
          file.SaveAs("" & GLOBAL_SITE_FOLDER & "/files/avatars/" & rsAvatar("avaFilename") & "")

          If SITE_VARIABLE_IMAGECOMPONENT = "aspimage" Then

            Dim objImage
            Dim strFileSource
            Dim strNewFile

            ' resten af billedebehandlingskoden...

          End if
        End if
        rsAvatar.Close
        set rsAvatar = nothing

og ja, det skal nedlægges i hver eneste iteration af din "for each" løkke, da du jo også opretter et nyt recordsetobjekt for hver iteration i løkken :)

Det samme gælder for dit forbindelsesobjekt til databasen, som skal lukkes inden din sides kode er færdig med at køre. Det er måske omend endnu vigtigere end at lukke recordsets! :)
Avatar billede softspot Forsker
05. oktober 2007 - 16:57 #11
Ligger subdomæne og hovedomæne på samme server ellers kan det (som tidligere nævnt) jo skyldes en forskel i de drivere som benyttes til at arbejde med databasen (på en Windows Server med IIS bør der været installeret MDAC 2.8 med de seneste patches).
Avatar billede Slettet bruger
05. oktober 2007 - 17:05 #12
Okay, så må jeg vist hellere komme igang med (det større arbejde) at rette de "fejl" med lukningen af de forskellige ting :)

Og jeg har kontaktet Web udbyderen, da jeg intet ved om serveren.

Så der er vist ikke mere vi kan gøre her :/
Men takker da mange gange for din hjælp og hvis du vil lægge et svar, så du kan få nogle point :)
Avatar billede softspot Forsker
05. oktober 2007 - 17:13 #13
Velbekomme.

Jeg håber du finde årsagen til at det fejler på subdomænet og ikke på hoveddomænet (det er rarest at have vished om den slags ;-))...
Avatar billede softspot Forsker
05. oktober 2007 - 17:25 #14
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