Avatar billede chrisrj Forsker
22. februar 2004 - 17:07 Der er 55 kommentarer og
1 løsning

Mystisk problem med næsten ens INSERTs - nogle virker, andre ikke

Jeg har et script som laver nogle INSERTs med filoplysninger
Tager jeg f.eks. filer på min harddisk ser INSERT sådan ud:
insert into filer (navn, storrelse, storrelseangivelse, type, sti) values ('DR.CFG', 2.87, 'KB', 'CFG-fil', '\\Deathr')

Og tager jeg filer fra mit CD-ROM drev ser det sådan ud:
insert into filer (navn, storrelse, storrelseangivelse, type, sti) values ('ENTSRV1.TXT', 39.88, 'KB', 'Tekstdokument', '\\DOCS')

Som man kan se, er der ikke stor. Ikke desto mindre fejler den sidste(fra CD-ROMen) med denne fejl:
Microsoft OLE DB Provider for ODBC Drivers (0x80040E09)
[TCX][MyODBC]You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1

Er der nogen der kan forklarer mig hvad problemet er? For jeg fatter det simpelthen ikke. :(
Og forøvrigt er det ligegyldigt om jeg laver 1,10,100 eller 1000 INSERTs af gangen - resultatet er altid det samme.
Avatar billede chrisrj Forsker
22. februar 2004 - 17:13 #1
Der skulle naturligvis ikke stå:
Som man kan se, er der ikke stor...

Men:
Som man kan se, er der ikke stor forskel...
Avatar billede trer Nybegynder
22. februar 2004 - 17:17 #2
Check lige længdeangivelserne på dine kolonner i tabellen - der skal være plads til dine data for at du kan indsætte dem..
Avatar billede chrisrj Forsker
22. februar 2004 - 17:21 #3
Der er 255 i dem alle, undtagen storrelseangivelse som er på 50 og storrelse er float. Så det er ikke det der er problemet, desværre.
Avatar billede trer Nybegynder
22. februar 2004 - 17:26 #4
Er det konsekvent at fx ovenstående insert med ENTSRV1.TXT fejler?
Avatar billede arne_v Ekspert
22. februar 2004 - 17:28 #5
Er de SQÆ sætninger præcise ?

Fordi umiddelbart lyder fejlen som noget der kunne opstå, hvis
en værdi indeholdet ' ...
Avatar billede chrisrj Forsker
22. februar 2004 - 17:34 #6
trer: Ja. Jeg har lige tjekket en ekstra gang og har fundet ud af at det heller ikke virker, hvis jeg henter fra en anden disk og på en diskette.

arne_v: Hvad mener du med præcise? Jeg tror ikke, at jeg har nogen filer med ' i filnavnet.
Avatar billede chrisrj Forsker
22. februar 2004 - 17:39 #7
Det er som om det ikke virker, medmindre filerne ligger på et FAT32 drev...
Hverken disketter, NTFS eller CD-ROM virker.
Avatar billede trer Nybegynder
22. februar 2004 - 17:41 #8
Prøv lige at lade dit script skrive sine inserts til en tekstfil fremfor at fyre dem af. Så kan du checke dem i hånden og se om det blot er en scriptfejl at nogle fejler..
Avatar billede chrisrj Forsker
22. februar 2004 - 17:45 #9
Jeg skriver dem bare til skærmen, disse virker:
insert into filer (navn, storrelse, storrelseangivelse, type, sti) values
('DR.CFG', 2.87, 'KB', 'CFG-fil', '\\Deathr'),
('DR.SG0', 2.12, 'KB', 'SG0-fil', '\\Deathr'),
('ENGINE.BPA', 378.11, 'KB', 'BPA-fil', '\\Deathr'),
('IBFILES.BPA', 83.97, 'KB', 'BPA-fil', '\\Deathr'),
('MENU.BPA', 3.02, 'MB', 'BPA-fil', '\\Deathr'),
('MUSICS.BPA', 5.46, 'MB', 'BPA-fil', '\\Deathr'),
('RALLY.EXE', 365.84, 'KB', 'Program', '\\Deathr'),
('SETUP.EXE', 33.42, 'KB', 'Program', '\\Deathr'),
('TR0.BPA', 329.39, 'KB', 'BPA-fil', '\\Deathr'),
('TR1.BPA', 313.86, 'KB', 'BPA-fil', '\\Deathr')

Disse gør ikke:
insert into filer (navn, storrelse, storrelseangivelse, type, sti) values ('ENTSRV1.TXT', 39.88, 'KB', 'Tekstdokument', '\\DOCS'),
('ENTSRV2.TXT', 44.05, 'KB', 'Tekstdokument', '\\DOCS'),
('ENTSRV3.TXT', 50.27, 'KB', 'Tekstdokument', '\\DOCS'),
('ENTSRV4.TXT', 42.76, 'KB', 'Tekstdokument', '\\DOCS'),
('ENTSRV5.TXT', 50.29, 'KB', 'Tekstdokument', '\\DOCS'),
('ENTSRV6.TXT', 46.19, 'KB', 'Tekstdokument', '\\DOCS'),
('READ1ST.TXT', 7.27, 'KB', 'Tekstdokument', '\\DOCS'),
('RELNOTES.HTM', 26.91, 'KB', 'HTML Document', '\\DOCS'),
('WNET_H_S_RGB_AI.GIF', 12.71, 'KB', 'ACDSee GIF Image', '\\DOCS'),
('INSTMSIW.EXE', 1.43, 'MB', 'Program', '\\I386\\ADMT\\PWDMIG')

Jeg kan ikke se nogle fejl, kan I?
Avatar billede arne_v Ekspert
22. februar 2004 - 17:47 #10
Nej, men det er alle dem hvor enten type eller sti er lange som fejler.
Avatar billede chrisrj Forsker
22. februar 2004 - 17:59 #11
Nix, de her kommer fint ind:
('Kopi af RALLYTekstdokumentTekstdokument.PIF', 2.78, 'KB', 'Genvej til MS-DOS-program', '\\Deathr'),
('Kopi af RALLYTekstdokumentTekstdokument.txt', 13, 'B', 'Tekstdokument', '\\Deathr')
Avatar billede chrisrj Forsker
22. februar 2004 - 19:30 #12
Er der virkelig ingen der har et bud på hvad der kan være galt?
Avatar billede arne_v Ekspert
22. februar 2004 - 19:53 #13
Alle dem du har nævnt som kommer ind ligger i  '\\Deathr' - er der noget
foreign key referentiel integritet trigger i din database ?
Avatar billede chrisrj Forsker
22. februar 2004 - 20:00 #14
Nu er jeg ikke synderlig meget inde i Mysql, men jeg har ikke oprettet andet end tabeller og kolonner.

Nu har jeg heller ikke vist alle dem der kommer ind - der er ca. 90 filer på drevet bla. også i denne mappe '\\Death Rally'.
Avatar billede trer Nybegynder
22. februar 2004 - 20:08 #15
For en god ordens skyld, prøv lige at rette den SQL som fyres af så hver tubble har sit eget INSERT statement.
Avatar billede chrisrj Forsker
22. februar 2004 - 21:01 #16
Jamen, selv om der kun er en, virker det ikke.
Avatar billede trer Nybegynder
22. februar 2004 - 22:58 #17
hmmm... hvor lang er den variabel i scriptet som du opbygger din insert i ?
Avatar billede chrisrj Forsker
22. februar 2004 - 23:40 #18
Hvor lang?

Mener du antal tegn, eller hvad?

Jeg laver den sådan her(i asp):
sql = "insert into filer (navn, storrelse, storrelseangivelse, type, sti) values"
...
...
...
sql = sql & " ('" & file.name & "', " & nysize & ", '" & nysizeangiv & "', '" & file.Type & "', '" & stien & "')"

Også har jeg lavet det sådan at den sættes til et bestemt tal, f.eks. 100, så den sidste del blever lavet 100 gange - det virker som sagt fint på min ene disk, men ikke andre steder. Og det hjælper ikke at sætte tallet til 1.
Avatar billede trer Nybegynder
22. februar 2004 - 23:56 #19
Ok, min ide byggede på, at i nogle script sprog er der grænser for hvor lange strenge kan være, men det er der ikke rigtig i vbs, så det er ikke det.

Umiddelbart giver dit problem ikke mening; hvad disk du scanner for at opbygge dine inserts er databasen jo totalt ligeglad med - for den er det bare nogle data.

Har du ikke mulighed for at se hvad din MySQL database reelt set modtager fra klienten?

Og lige et forsøg, prøv at tilføje følgende funktion til dit script

function Fix(name)
  Fix = "'" & Replace(name,"'","") & " '"
end function

og ret så din SQL opbygning som følger

sql = sql & " (" & Fix(file.name) & ", " & nysize & ", " & Fix(nysizeangiv) & ", " & Fix(file.Type) & ", " & Fix(stien) & ")"

Det sikrer at der er data i alle kolonner og at de ikke indeholder en '
Avatar billede chrisrj Forsker
23. februar 2004 - 00:24 #20
Ok, NU bliver det først mystiskt!

Hvis jeg bruger din kode, virker det overhovet ikke.

Men "gamle" kode kan jeg få til at virker på nogle af mine mapper. F.eks. en med store filer(+600 mb) og i denne mappe (G:\download\doc) som få små filer, men ikke i G:\ddrev som indeholder mange filer+mapper af forskellig størrelse. Koden fejler dog altid på den første fil. hvilket er den underste undermappe(hvis man kan kalde det det) som her er: '\\ddrev\\dmivejr3\\Data'.

Hele INSERTen:
insert into filer (navn, storrelse, storrelseangivelse, type, sti) values ('rad00000.bmp', 4.63, 'KB', 'ACDSee BMP Image', '\\ddrev\\dmivejr3\\Data')
Avatar billede trer Nybegynder
23. februar 2004 - 00:40 #21
Du bemærkede at Fix styrer alt med ' tegnet - så der ikke skal være ' i sql = sql & .... sætningen?
Avatar billede chrisrj Forsker
23. februar 2004 - 00:43 #22
Ja, jeg kopierede din kode ind og udkommenterede min egen.
INSERTen ud taget fra skærmen og bliver udskrevet således:
Response.write "sql " & sql & "<br>"
Avatar billede trer Nybegynder
23. februar 2004 - 00:50 #23
Hmm - underligt; Fix gør nemlig at samtlige strenge slutter med et mellemrum - og det gør din insert du viser ikke.
Avatar billede chrisrj Forsker
23. februar 2004 - 00:52 #24
Nej, det fjernede jeg - jeg troede det var en fejl. :)
Men det ændre ikke noget.
Avatar billede trer Nybegynder
23. februar 2004 - 00:58 #25
Hmm... underligt.  Umiddelbart tror jeg, at det må være en fejl i dit script et sted.

Hvad sker der, hvis du kopierer dine insert-statements fra skærmen og fyrer dem af direkte mod databasen fra fx phpadmin?
Avatar billede chrisrj Forsker
23. februar 2004 - 01:02 #26
Nu har jeg ikke noget PHP, men jeg har da MySQL-Front 2.5 og der virker det fint. Mystiskt.
Hvordan er dine asp evner? Vil du se koden?
Avatar billede trer Nybegynder
23. februar 2004 - 01:06 #27
Mit brug af ASP / VBS er mest til husbehov, men prøv at smide koden her. Der kan være andre der har ideer...
Avatar billede trer Nybegynder
23. februar 2004 - 01:06 #28
Kan i øvrigt godt være, at jeg først får kigget i morgen ...
Avatar billede chrisrj Forsker
23. februar 2004 - 01:09 #29
Ok, det er ok - jeg skal også snart i seng. :)

Spørg bare hvis der er noget du ikke forstår, så vil jeg (prøve at) forklare koden. :)

<%
    cdid = Request.QueryString("id")
    genindekser = Request.QueryString("genindekser")
    Server.ScriptTimeout = 50000
    Const adOpenKeyset = 1
    Const adLockOptimistic = 3
    Set Conn = Server.CreateObject("ADODB.Connection")
    Conn.Open "DRIVER={MySQL}; server=localhost; database=database; uid=administrator; pwd=;"
    if genindekser = "true" then
        if cdid = "" then
            response.write "Fejl. CD kunne ikke indekseres. Intet CD id. Prøv igen."
            response.end
        else
            sql = "delete * from filer where cdid="&cdid
            Conn.execute(sql)
        end if
    else
        if genindekser = "false" then
            rootpath = "G:\ddrev"
            level = 0
            Response.Write "Directory: " & rootpath & "<BR><BR>"
            antalfiler = 0
            antalmapper = 0
            sqltest = 0
            sql = "insert into filer (navn, storrelse, storrelseangivelse, type, sti) values"
       
            sub getPath(strPath,level)
                Set fsObj = CreateObject("Scripting.FileSystemObject")
                Set MainFolder = fsObj.GetFolder(strPath)
                Set Files = MainFolder.Files
                Set Folders = MainFolder.subfolders
       
                For Each Folder in Folders
                    call getPath(strPath & "\" & folder.name,level+1)
                next
       
                For Each File in Files
                    sqltest = sqltest + 1
                    nysize = 0
                    nysize = file.Size
                    i = 0 '0=bytes ; 1=kbytes ; 2=Mbytes ; 3 = Gbytes
                   
                    do while nysize > 1024 and i < 3
                      nysize = nysize / 1024
                      i=i+1
                    loop
                    arr = split(nysize, ",")
                    nysize = FormatNumber(arr(0),0,0,0,-1)
                    if Ubound(arr)>=1 then
                      nysize = nysize & "." & (left(arr(1), 2))
                    end if
                    'Sæt enten KB,MB eller GB
                    Select case i
                    case 0
                        nysizeangiv = "B"
                    case 1
                      nysizeangiv = "KB"
                    case 2
                      nysizeangiv = "MB"
                    case 3
                      nysizeangiv = "GB"
                    end select
       
                    sti = len(file.parentfolder)
                    arr = split(file.parentfolder, "\")
                    stien = ""
                    if Ubound(arr)>=1 then
                        for i = 0 to UBOUND( arr )
                        next
                        for j = 1 to (i-1)
                            stien = stien & "\\" & arr(j)
                        next
                    end if
                   
                    if sqltest = 1 then
                        sql = sql & " ('" & file.name & "', " & nysize & ", '" & nysizeangiv & "', '" & file.Type & "', '" & stien & "')"
                        'sql = sql & " (" & Fix(file.name) & ", " & nysize & ", " & Fix(nysizeangiv) & ", " & Fix(file.Type) & ", " & Fix(stien) & ")"
                        Response.write "sql " & sql & "<br>"
                        sql = "insert into filer (navn, storrelse, storrelseangivelse, type, sti) values"
                        Conn.execute(sql)
                        sqltest = 0
                        response.end
                    else
                        sql = sql & " ('" & file.name & "', " & nysize & ", '" & nysizeangiv & "', '" & file.Type & "', '" & stien & "'),"
                        'sql = sql & " (" & Fix(file.name) & ", " & nysize & ", " & Fix(nysizeangiv) & ", " & Fix(file.Type) & ", " & Fix(stien) & ")"
                    end if
           
                next
           
                set fsObj = Nothing
                set MainFolder = Nothing
            end sub
           
            call getPath(rootpath,level)
            sql = left(sql, (len(sql) -1))
            Response.write "størrelsen af sql: " & len(sql) & "<br>" & "sql " & sql
            Conn.execute(sql)
            sql = "UPDATE cder SET indeksering=0"
            Conn.execute(sql)
        else 'if genindekser = false then
            response.write "Fejl. CD kunne ikke indekseres. Prøv igen."
            response.end
        end if
        end if
    function Fix(name)
          Fix = "'" & Replace(name,"'","") & " '"
    end function
%>
Avatar billede trer Nybegynder
23. februar 2004 - 01:30 #30
Ok, jeg kan se hvorfor min fix ikke fungerede. Du har ikke tilføjet et , efter strengen når du opbygger et bulk statement.

Dernæst, er lidt træt så muligvis er det i skoven, men lav lige din

sql = left(sql, (len(sql) -1))

om til

sql = left(trim(sql), (len(trim(sql)) -1))

og den her
                    sti = len(file.parentfolder)
                    arr = split(file.parentfolder, "\")
                    stien = ""
                    if Ubound(arr)>=1 then
                        for i = 0 to UBOUND( arr )
                        next
                        for j = 1 to (i-1)
                            stien = stien & "\\" & arr(j)
                        next
                    end if

kan laves om til

sti = replace(file.parentfolder,"\","\\")

Slutteligt, du har vist byttet om på to linjer her ved 1 statement;
sql = "insert into filer (navn, storrelse, storrelseangivelse, type, sti) values"
Conn.execute(sql)
Avatar billede chrisrj Forsker
23. februar 2004 - 01:35 #31
Det er nogle interessante forslag du har.

Jeg kigger på det imorgen.

Godnat. :)
Avatar billede chrisrj Forsker
23. februar 2004 - 10:55 #32
Stort! Nu virker det næsten. :)

Det var dit sidste forslag, der var fejlen.

Nu har jeg dog et andet problem. Nemlig filstørrelsen, et eks. 1.018.53 som enten skulle være 1.018,53 eller 1,018.53. Hvordan får jeg klaret den?

Koden er her:
nysize = 0
nysize = file.Size
i = 0 '0=bytes ; 1=kbytes ; 2=Mbytes ; 3 = Gbytes
                   
do while nysize > 1024 and i < 3
  nysize = nysize / 1024
  i=i+1
loop
arr = split(nysize, ",")
nysize = FormatNumber(arr(0),0,0,0,-1)
if Ubound(arr)>=1 then
  nysize = nysize & "." & (left(arr(1), 2))
end if
if nysize = NULL or nysize = "" then
    nysize = 0
    i = 0
end if

Jeg kunne forstille mig at det har noget at gøre med denne linie:
nysize = FormatNumber(arr(0),0,0,0,-1)

Men hvordan skal den rettes?
Avatar billede chrisrj Forsker
23. februar 2004 - 12:22 #33
Jeg tror det virekr nu. Jeg rettede storrelse kolonnen til tekst.

Smid lige et svar, så får du dine vel fortjente points! :)
Avatar billede trer Nybegynder
23. februar 2004 - 12:36 #34
Ok, et svar.
Avatar billede chrisrj Forsker
23. februar 2004 - 12:41 #35
Liige et lille tillægsspørgsmål. :)

Ved du noget hvor lang tid mysql er om at slette f.eks. 16000 poster på 1.4 Ghz med 512 ram?
Jeg synes det tager urimelig lang tid, dvs mere end 5 minutter. Og bare jeg prøver at opdatere 1 eller 2 poster i Mysql-Front i samme tabel, tager det også enormt lang tid.
Avatar billede arne_v Ekspert
23. februar 2004 - 12:42 #36
Af almindelig interesse: hvad var fejlen i den oprindelige SQL ?

(som i 22/02-2004 17:45:54)
Avatar billede trer Nybegynder
23. februar 2004 - 12:44 #37
Hmm.. 16.000 poster på 5 minutter - det er urimelig sløvt! Ikke engang Access er så langsom.

Har du indeks på tabellen - og har du checket disken for fragmentation?
Avatar billede chrisrj Forsker
23. februar 2004 - 12:44 #38
arne_v -> Se min kommentar af 23/02-2004 10:55:28:
"Det var dit sidste forslag, der var fejlen."

Som var:
Kommentar: trer
23/02-2004 01:30:20
"Slutteligt, du har vist byttet om på to linjer her ved 1 statement;
sql = "insert into filer (navn, storrelse, storrelseangivelse, type, sti) values"
Conn.execute(sql)"
Avatar billede chrisrj Forsker
23. februar 2004 - 12:52 #39
Index? Det noget man skal oprette selv?

fragmentation? Uhhh, nævn det ikke..Min disk skriger nok efter det. ;)
Avatar billede arne_v Ekspert
23. februar 2004 - 12:54 #40
Det har jeg læst, men jeg forstod ikke hvad du hentydede til.
Avatar billede chrisrj Forsker
23. februar 2004 - 12:55 #41
trer -> Min filid er primarykey, er det det du tænker på?

arne_v -> ...Men det gør du nu, eller hvad?
Avatar billede arne_v Ekspert
23. februar 2004 - 12:57 #42
Nope - jeg er stadig totalt forvirret
Avatar billede chrisrj Forsker
23. februar 2004 - 13:02 #43
Ok, arne_v nu skal jeg forklare det. :)

Her er den funkerende kode:
...
...
...
if sqltest = 999 then
    sql = sql & " (" & Fix(file.name) & ", " & Fix(nysize) & ", " & Fix(nysizeangiv) & ", " & Fix(file.Type) & ", " & Fix(stien) & ", " & cdid & ")"
    Conn.execute(sql)
    sql = "insert into filer (navn, storrelse, storrelseangivelse, type, sti, cdid) values"
    sqltest = 0
else
    sql = sql & " (" & Fix(file.name) & ", " & Fix(nysize) & ", " & Fix(nysizeangiv) & ", " & Fix(file.Type) & ", " & Fix(stien) & ", " & cdid & "),"
end if
...
...
...

Problemet var at der var byttet rundt på disse to linier:
Conn.execute(sql)
sql = "insert into filer (navn, storrelse, storrelseangivelse, type, sti, cdid) values"

Så koden så sådan ud:
...
...
...
if sqltest = 999 then
    sql = sql & " (" & Fix(file.name) & ", " & Fix(nysize) & ", " & Fix(nysizeangiv) & ", " & Fix(file.Type) & ", " & Fix(stien) & ", " & cdid & ")"
    sql = "insert into filer (navn, storrelse, storrelseangivelse, type, sti, cdid) values"
    Conn.execute(sql)
    sqltest = 0
else
    sql = sql & " (" & Fix(file.name) & ", " & Fix(nysize) & ", " & Fix(nysizeangiv) & ", " & Fix(file.Type) & ", " & Fix(stien) & ", " & cdid & "),"
end if
...
...

Altså overskrev jeg de "gamle" inserts og begyndte en ny, før jeg executede. :)
Avatar billede trer Nybegynder
23. februar 2004 - 13:04 #44
arne_v> I scriptet var der byttet om på nogle linjer så det SQL der blev vist på skærmen ikke var det samme som blev sendt til databasen. MySQL modtog derfor kun et halvt INSERT statement - og det brokkede den sig over.

chrisrj> Mht indeks; Ja, man skal oprette det selv, men primærnøglen (en constraint) er på næsten alle databaser i dag automatisk lavet som et indeks.

Indeks gør at det er hurtigere at finde rækker, men sløver ned ved simple indsættelser og bulk-sletninger da indekset skal opdateres. Derfor spurgte jeg om indeks (der er en ok artikel om indeks på MySQL i artikel sektionen).

MySQL benytter filer som tabeller hvis jeg husker ret. Den er derfor meget følsom for fragmentation af disse filer. Prøv at defragmentere din disk.
Avatar billede arne_v Ekspert
23. februar 2004 - 13:09 #45
Så begynder det at dæmre lidt - nu mangler jeg kun at forstå hvorfor
nogen af dem gik godt.
Avatar billede chrisrj Forsker
23. februar 2004 - 13:14 #46
trer -> det gør jeg nok også på et tidspunkt, men da jeg tjekkede med Diskeeper var der ingen af mysql filerne der var fragmenteret.
"MySQL benytter filer som tabeller hvis jeg husker ret"
Jeps.

arne_v -> fordi der ikke var så mange at den del af kode blev udført, men kun den sidste del:
if sqltest = 999 then
...
...
...
end if
next
set fsObj = Nothing
set MainFolder = Nothing
end sub
           
call getPath(rootpath,level)sql = left(trim(sql), (len(trim(sql)) -1))
Response.write "størrelsen af sql: " & len(sql) & " Antal filer: " & sqltest & "<br>"
Conn.execute(sql)
sql = "UPDATE cder SET indeksering=0 where id ="&cdid
Conn.execute(sql)
Avatar billede trer Nybegynder
23. februar 2004 - 13:22 #47
Hvad med memory load på din maskine - laver den hard page faults (swap til disk) når du arbejder med MySQL ?
Avatar billede chrisrj Forsker
23. februar 2004 - 14:07 #48
"hard page faults (swap til disk)"?
Mener du megen diskaktivitet? Nej.

Jeg har ikke andre tunge programmer kørende.
Avatar billede trer Nybegynder
23. februar 2004 - 15:07 #49
Nem & hurtig måde at checke det på; Tryk CTRL-SHIFT-ESC for at starte taskmanager. Se på fanen Processes og tilføj kolonnen PF Delta. Hold øje med hvad der sker på den når du indsætter / sletter rækker.

Den bør blive stående på 0 - ellers swapper din maskine til disk.
Avatar billede chrisrj Forsker
24. februar 2004 - 11:11 #50
Der sker ikke noget i den kolonne.

Kan det have noget at sige at Mysql-Front er fra 2002 og Mysql er den nyeste(4.00)?

Skal jeg bruge et andet API, eller er det ligemeget?
Avatar billede chrisrj Forsker
24. februar 2004 - 11:59 #51
Jeg forøbrigt lige lagt mærke til at alle posterne eksistere 2 gange - altså er lagt ind 2 gange.

Det pudsige er, at filernes id(filid) er precist antallet filer større. Altså hvis der er f.eks. 30 filer på CDen, vil med IDerne xxx01 og xxx31 være identiske.

Hvordan kan det være?
Avatar billede chrisrj Forsker
24. februar 2004 - 12:24 #52
Det hjælpe nok lidt på forståelsen, hvis man skriver det hele: :)

Altså hvis der er f.eks. 30 filer på CDen, vil filerne med IDerne xxx01 og xxx31 være identiske.
Avatar billede trer Nybegynder
24. februar 2004 - 14:12 #53
Det med id'erne - det lyder som om du har script fejl stadigvæk.

Mht performance - prøv at droppe tabellen og genoprette den.
Avatar billede chrisrj Forsker
24. februar 2004 - 15:07 #54
Ja, men hvor er den fejl? :)

Jeg har lavet nogle små ændringer, vil du se den fulde kode igen?
Avatar billede chrisrj Forsker
25. februar 2004 - 23:59 #55
Jeg har nu gennemtjekket koden, og jeg KAN ikke finde nogen fejl. Kan du?

<HTML>
<HEAD></HEAD>
<BODY>
<FONT SIZE="2" FACE="Courier">
<%
    cdid = Request.QueryString("id")
    genindekser = Request.QueryString("genindekser")
    Server.ScriptTimeout = 50000
    Const adOpenKeyset = 1
    Const adLockOptimistic = 3
    Set Conn = Server.CreateObject("ADODB.Connection")
    Conn.Open "DRIVER={MySQL}; server=localhost; database=database; uid=administrator; pwd=;"
    if genindekser = "true" then 'Skal CD genindekseres?
        if cdid = "" then 'Hvis CD skal genindekseres skal vi bruge et CDid
            response.write "Fejl. CD kunne ikke indekseres. Intet CD id. Prøv igen."
            response.end
        else
            sql = "delete * from filer where cdid="&cdid
            Conn.execute(sql)
        end if
    else
        if genindekser = "false" then 'Skal CD indekseres?
            rootpath = "f:\" 'Her finder vi filerne
            level = 0 'Vi starter i 'rootpath'
            Response.Write "Directory: " & rootpath & "<BR><BR>"
            antalfiler = 0
            antalmapper = 0
            sqltest = 0
            ' Vi opbygger starten på sql sætningen
            sql = "insert into filer (navn, storrelse, storrelseangivelse, type, sti, cdid) values"
       
            sub getPath(strPath,level) '"arbejdshesten" :)
                response.write "<b>Kald til sub</b><br>"
                Set fsObj = CreateObject("Scripting.FileSystemObject")
                Set MainFolder = fsObj.GetFolder(strPath)
                Set Files = MainFolder.Files
                Set Folders = MainFolder.subfolders
       
                For Each Folder in Folders 'vi finder alle mapper der skal gennemsøges for filer
                    response.write "ny mappe: <b>" & folder.name & "</b><br>"
                    call getPath(strPath & "\" & folder.name,level+1) 'rekursivt kald
                next
                response.write "ikke flere undermapper<br>"
                For Each File in Files 'her arbejder vi med de enkelte filer
                    response.write "ny fil: <b>" & file.name & "</b><br>"
                    sqltest = sqltest + 1 'her tæller vi antallet af filer op
                    nysize = 0
                    nysize = file.Size 'put filstørrelsen(i bytes) over i en variabel
                    i = 0 '0=bytes ; 1=kbytes ; 2=Mbytes ; 3 = Gbytes
                   
                    do while nysize > 1024 and i < 3 'her gør vi filstørrelsen læsevenlig
                      response.write "retter filstørrelse<br>"
                      nysize = nysize / 1024        ', dog ikke mere end til gigabytes
                      i=i+1
                    loop
                    arr = split(nysize, ",")
                    nysize = FormatNumber(arr(0),0,0,0,-2)
                    if Ubound(arr)>=1 then
                      response.write "der er komma<br>"
                      nysize = nysize & "," & (left(arr(1), 2))
                    end if
                    if nysize = NULL or nysize = "" then 'her sikre vi os at der ER en filstørrelse
                        response.write "filstørrelse er 0<br>"
                        nysize = 0
                        i = 0
                    end if
                    'Sæt enten KB,MB eller GB
                    Select case i
                    case 0
                        nysizeangiv = "B"
                        response.write "filstørrelse er byte<br>"
                    case 1
                      nysizeangiv = "KB"
                      response.write "filstørrelse er kilobyte<br>"
                    case 2
                      nysizeangiv = "MB"
                      response.write "filstørrelse er megabyte<br>"
                    case 3
                      nysizeangiv = "GB"
                      response.write "filstørrelse er gigabyte<br>"
                    end select
                    'her formatere vi stien til databasen
                    sti = file.parentfolder
                    sti = right(trim(sti), (len(trim(sti)) -2)) 'her fjerner vi drevnavnet, f.eks. i:
                    stien = replace(sti,"\","\\")
                   
                    if sqltest = 10 then 'her skal vi ind når vi har samlet 999 filer
                        'her sætter vi den sidste fil på sql sætningen
                        sql = sql & " (" & Fix(file.name) & ", " & Fix(nysize) & ", " & Fix(nysizeangiv) & ", " & Fix(file.Type) & ", " & Fix(stien) & ", " & cdid & ")"
                        'her vises størrelsen af sql sætningen og antallet af filer(minus 1) der skrives til databasen
                        Response.write "størrelsen af sql: " & len(sql) & " Antal filer: " & sqltest & "<br>"
                        response.write "<b>så executer vi sql</b> " & sql & "<br>"
                        'Conn.execute(sql) 'her smider vi dem i databasen
                        'her begynder vi ny sql sætning
                        sql = "insert into filer (navn, storrelse, storrelseangivelse, type, sti, cdid) values"
                        sqltest = 0 'husk at sætte antallet af filer tilabge til 0
                        response.write "<b>frisk sql:</b> " & sql & "<br>"
                        'response.end
                    else 'hvis vi endnu ikke er nået op på 999 filer, skal vi bare tilføje filen til sql sætningen
                        response.write "så laver vi sqlsætning:<br>"
                        sql = sql & " (" & Fix(file.name) & ", " & Fix(nysize) & ", " & Fix(nysizeangiv) & ", " & Fix(file.Type) & ", " & Fix(stien) & ", " & cdid & "),"
                        response.write "sql er nu: " & sql & "<br>"
                    end if
                    response.write "<b>færdig med fil i forløkke</b><br><br>"
                next
           
                set fsObj = Nothing
                set MainFolder = Nothing
                response.write "<b>færdig med filerne i mappen</b><br><br>"
            end sub
           
            response.write "så starter vi<br>"
            call getPath(rootpath,level) 'her kalder vi "arbejdshesten"
           
            'her sikre vi os at der ikke er flere filer der skal lægges i databasen
            if not sql = "insert into filer (navn, storrelse, storrelseangivelse, type, sti, cdid) values" then
                response.write "sql mangler at execute<br>"
                sql = left(trim(sql), (len(trim(sql)) -1)) 'her fjerner vi det sidste komma
                'her vises størrelsen af sql sætningen og antallet af filer(minus 1) der skrives til databasen
                Response.write "størrelsen af sql: " & len(sql) & " Antal filer: " & sqltest & "<br>"
                'Conn.execute(sql) 'her smider vi dem i databasen
                response.write "<b>sql er executed:</b> " & sql & "<br>"
            end if
            'her sætte vi CDen til at være indekseret
            sqle = "UPDATE cder SET indeksering=0 where id ="&cdid
            'Conn.execute(sqle)
            response.write "<b>sidste sql er executed:</b> " & sqle
        else 'if genindekser = false then
            response.write "Fejl. CD kunne ikke indekseres. Prøv igen."
            response.end
        end if
        end if
    function Fix(name) 'hjælpe funktion til tekstfelterne i databasen
        response.write "vi fixer..." & name & " "
          Fix = "'" & Replace(name,"'","") & "'"
          response.write "fixet..." & Fix & "<br>"
    end function
%>
</FONT>
</BODY>
</HTML>

Sig til hvis du vil prøve koden, så smider jeg lige et link.
Avatar billede trer Nybegynder
26. februar 2004 - 00:28 #56
Jeg får nok først tid at kigge på koden i weekenden - vil stort set ikke være online de næste par dage.
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
Computerworld tilbyder specialiserede kurser i database-management

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