Avatar billede passiflora Juniormester
27. november 2009 - 01:31 Der 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


Nogen der kan hjælpe.?
Avatar billede claes57 Ekspert
27. november 2009 - 08:33 #1
jeg ville placere
linie = Split(f.ReadLine,";")
lige før loop, og en gang til som sidste linje i loop
Avatar billede passiflora Juniormester
27. november 2009 - 08:44 #2
claes57 ikke rigtig forstået, loop er det ikke sidste linie i loop'et ..?
Avatar billede claes57 Ekspert
27. november 2009 - 08:54 #3
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

sådan...
Avatar billede passiflora Juniormester
27. november 2009 - 09:01 #4
Ok ...
Vil du hjælpe mig til at forstå hvorfor ...

Tak ...
Avatar billede 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.
Avatar billede passiflora Juniormester
27. november 2009 - 10:45 #6
Vil det sige noget i stil med dette ...


<!-- #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)
linie = Split(f.ReadLine,";")
Set rsSave = Server.CreateObject("ADODB.RecordSet")
strDSN = "DRIVER={Microsoft Access Driver (*.mdb)};DBQ="&Server.MapPath("/data/data.mdb")
Do While not f.AtEndOfStream
    rsSave.open "bsk", strDSN, adOpenDynamic, adLockOptimistic, adCmdTable
    rsSave.addnew
    rsSave("user") =  trim(linie(0))
    rsSave("knr") =  trim(linie(1))
    rsSave.update
    linie = Split(f.ReadLine,";")
loop
f.Close
rsSave.close
set rsSave = Nothing


I starten sletter jeg gammelt indhold ... er det korrekt at den forbindelse ikke skal lukkes ...
Avatar billede claes57 Ekspert
27. november 2009 - 10:48 #7
jeg er med på thomasso's ting også.

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
Avatar billede passiflora Juniormester
27. november 2009 - 10:58 #8
Lækkert ...

Det omkring toppen sletning af gammelt materiale er det ok ...

Så mangler jeg vist kun 2 ting ...

TAK for hjælpen,
Samt et par svar ...
Avatar billede passiflora Juniormester
27. november 2009 - 22:29 #9
Det virker temmelig meget bedre ...

Tak
Avatar billede Slettet bruger
28. november 2009 - 11:10 #10
Jamen så ligger jeg et lille svar.
Synes måske claes57 fortjener de fleste point :)
Avatar billede passiflora Juniormester
02. december 2009 - 11:32 #11
... ærgerligt at den jeg ikke får vist sidste linie ... ;)
Avatar billede claes57 Ekspert
05. januar 2010 - 12:56 #12
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

point - glem det bare...
Avatar billede passiflora Juniormester
05. januar 2010 - 13:33 #13
Ok ... tak for hjælpen ...

Nu tildelte jeg jo godt nok til anden side, nu da jeg ikke fik svar fra dig. Giver gerne .. værdifuld hjælp ...

Søren
Avatar billede claes57 Ekspert
05. januar 2010 - 15:29 #14
det var bare en service-oplysning. Point er underordnet.
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