05. oktober 2007 - 14:42Der 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
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
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.
Synes godt om
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)
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).
Synes godt om
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.
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
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... :)
Er der forskel på hvormange filer du uploader når det fungerer, eller er det altid en fil du uploader?
Synes godt om
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 ?
Synes godt om
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...
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! :)
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).
Synes godt om
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 :)
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.