27. november 2009 - 01:31Der er
13 kommentarer og 1 løsning
Opdatering af Access med data fra en csv-fil
Hej
Ville bygge en opdateringsfil, asp, som kunne trække data ind fra en csv fil til en access database.
Noget går galt / tager forlang tid
Her er min kode <!-- #include virtual="/ADOVBS.inc" --> <% Set krs = Server.CreateObject("ADODB.RecordSet") strDSN = "DRIVER={Microsoft Access Driver (*.mdb)};DBQ="&Server.MapPath("/data/data.mdb") strsql = "delete FROM bsk" krs.Open strSQL, strDSN, 1
Dim fso, f, filespec Set fso = CreateObject("Scripting.FileSystemObject") filespec = Server.Mappath("/BESTSELL_KU.CSV") Set f = fso.OpenTextFile(filespec,1) Do While not f.AtEndOfStream linie = Split(f.ReadLine,";") Set rsSave = Server.CreateObject("ADODB.RecordSet") strDSN = "DRIVER={Microsoft Access Driver (*.mdb)};DBQ="&Server.MapPath("/data/data.mdb") rsSave.open "bsk", strDSN, adOpenDynamic, adLockOptimistic, adCmdTable rsSave.addnew rsSave("user") = trim(linie(0)) rsSave("knr") = trim(linie(1)) rsSave.update rsSave.close set rsSave = Nothing loop f.Close
Set f = fso.OpenTextFile(filespec,1) linie = Split(f.ReadLine,";") Do While not f.AtEndOfStream Set rsSave = Server.CreateObject("ADODB.RecordSet") strDSN = "DRIVER={Microsoft Access Driver (*.mdb)};DBQ="&Server.MapPath("/data/data.mdb") rsSave.open "bsk", strDSN, adOpenDynamic, adLockOptimistic, adCmdTable rsSave.addnew rsSave("user") = trim(linie(0)) rsSave("knr") = trim(linie(1)) rsSave.update rsSave.close set rsSave = Nothing linie = Split(f.ReadLine,";") loop
Ok ... Vil du hjælpe mig til at forstå hvorfor ...
Tak ...
Synes godt om
Slettet bruger
27. november 2009 - 10:22#5
Jeg ville nok også placere:
Set rsSave = Server.CreateObject("ADODB.RecordSet") strDSN = "DRIVER={Microsoft Access Driver (*.mdb)};DBQ="&Server.MapPath("/data/data.mdb")
Uden for loopet. Der er vel ingen grund til at oprette database-objekterne inde i selve loopet for hver linie i tekstfilen. Det vil i mine øjne give et ekstremt overhead.
Opret objektet og sæt det for hver post, hvor det behøves.
Min placering af readline gør, at filen bliver læst før den tester på eof første gang - og så er eof-værdien sat. I loopet behandles post, og næste læses, hvis der er flere.
Vi kører lige resten af optimeringen igennem - speeder også rutinen op:
Set rsSave = Server.CreateObject("ADODB.RecordSet") strDSN = "DRIVER={Microsoft Access Driver (*.mdb)};DBQ="&Server.MapPath("/data/data.mdb") rsSave.open "bsk", strDSN, adOpenDynamic, adLockOptimistic, adCmdTable Set f = fso.OpenTextFile(filespec,1) linie = Split(f.ReadLine,";") Do While not f.AtEndOfStream rsSave.addnew rsSave("user") = trim(linie(0)) rsSave("knr") = trim(linie(1)) rsSave.update linie = Split(f.ReadLine,";") loop rsSave.close set rsSave = Nothing
ReadLine virker ikke på sidste linje, da linjen ikke slutter med et linjeskift. hvis du inden kørsel tilføjer et CrLf til filen, så er den med. det gøres altså lige før disse to linjer
Set f = fso.OpenTextFile(filespec,1) linie = Split(f.ReadLine,";")
hvor der skal appendes et linjeskift (konstanten vbCrLf) Set f = fso.OpenTextFile(filespec, ForAppending, True) f.WriteLine(vbCrLf) f.Close
det var bare en service-oplysning. Point er underordnet.
Synes godt om
Ny brugerNybegynder
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.