Avatar billede jaxx666 Nybegynder
25. juni 2008 - 11:27 Der er 6 kommentarer og
1 løsning

import af stor txtfil til access

Hej.
Jeg håber der er nogen der kan hjælpe mig lidt videre med følgende problem.
Jeg har en ret stor tekstfil som skal importeres ind i en access database. Filen fylder over 4mb og indeholder over 60.000 linjer.
Min kode tager filen ind i en streamreader og "renser" den for ugyldige tegn, hvorefter den opdeles i felt.
Herefter importeres linje for linje ind i access.
Mit problem er at behandlingtiden er alt for lang. Det tager flere minutter at behandle filen. Er der noget man kan gøre for at optimere dette?
Min kode er følgende.

Private Sub importmodtager()
Dim splitstring As Array, dbconnection As OleDbConnection, cmd, cmdusers As OleDbCommand
Dim sqlmodtager, sqlusers, filindhold, filindholdtemp, modtagernummer, modtagernavn, modtageradresse As String
Dim email, password As String
'Åben forbindelsen til databasen
        dbconnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & db_path & ";")
        dbconnection.Open()
        Dim myStreamReader As New StreamReader(modtager_path)
        txtboxstatus.AppendText("Import modtagere" & vbLf)

        While Not myStreamReader.EndOfStream
            filindhold = myStreamReader.ReadLine
            filindholdtemp = Replace(filindhold, ";", "") 'fjern alle ;
            filindholdtemp = Replace(filindholdtemp, """,""", ";") ' replace alle "," til ;
            filindholdtemp = Replace(filindholdtemp, """", "") 'fjern alle "
            filindholdtemp = Replace(filindholdtemp, "'", "") 'fjern alle '
            splitstring = Split(filindholdtemp, ";") 'del strengen efter hvert semikolon ;
            'Tildel felter fra array
            modtagernummer = splitstring(0)
            modtagernavn = splitstring(1)
            modtageradresse = splitstring(2)
            'felter til users tabellen
            email = splitstring(3)
            password = splitstring(4)
            'Opdater modtager tabellen
            Try
                sqlmodtager = "insert into modtagertabel (modtager_nummer,modtager_navn,modtager_adresse) values('" & modtagernummer & "','" & modtagernavn & _
                              "','" & modtageradresse & "')"
                cmd = New OleDbCommand(sqlmodtager, dbconnection)
                cmd.ExecuteNonQuery() ' kør jobbet !
                txtboxstatus.AppendText(sqlmodtager & vbLf)
                'Opdater samtidigt users tabellen
                sqlusers = "insert into users (userid,email,password) values('" & modtagernummer & "','" & email & _
                            "','" & password & "')"
                cmdusers = New OleDbCommand(sqlusers, dbconnection)
                cmdusers.ExecuteNonQuery() 'kør users jobbet         
            Catch exception As System.Data.OleDb.OleDbException ' recorden eksisterer i forvejen
                ' 'update modtagertabellen
                Dim sqlupdatemodtager As String
                sqlupdatemodtager = "update (modtagertabel) set modtager_nummer='" & modtagernummer & "',modtager_navn='" & modtagernavn & _
                                "',modtager_adresse='" & modtageradresse & "' Where modtager_nummer='" & modtagernummer & "'"

                Dim cmdupdatemodtager As New OleDbCommand(sqlupdatemodtager, dbconnection)
                cmdupdatemodtager.ExecuteNonQuery()
                'update userstabellen
                Dim sqlupdateusers As String
                sqlupdateusers = "update (users) set userid='" & modtagernummer & "',email='" & email & "',password='" & password & _
                                "' Where userid='" & modtagernummer & "'"
                Dim cmdupdateusers As New OleDbCommand(sqlupdatemodtager, dbconnection)
                cmdupdatemodtager.ExecuteNonQuery()
            End Try
        End While
        'Dim cmdusers As New OleDbCommand(sqlbuild, dbconnection)
        txtboxstatus.AppendText("modtagere importeret" & vbLf)
        myStreamReader.Close() 'Luk streamreaderen
        dbconnection.Close() 'luk forbindelse til databasen
    End Sub
Avatar billede arne_v Ekspert
26. juni 2008 - 04:12 #1
Access er ikke super god til store data mængder.

Du kan muligvis optimere lidt ved at:
- bundle flere inserts i en enkelt transaction
- bruge parameters og genbruge din Command til alle inserts

(ihvertfald ville det hjælpe med SQLServer o.a.)
Avatar billede arne_v Ekspert
26. juni 2008 - 04:12 #2
Og sikker dig at du ikke har for mange exceptions - det tager lidt tid med sådan en.
Avatar billede arne_v Ekspert
29. august 2008 - 02:50 #3
OK ?
Avatar billede arne_v Ekspert
28. oktober 2008 - 03:08 #4
?
Avatar billede jaxx666 Nybegynder
28. oktober 2008 - 09:22 #5
hej.
tak for din hjælp.
Avatar billede arne_v Ekspert
28. oktober 2008 - 14:03 #6
Hvis spoergsmaalet skal lukkes, saa skal du acceptere svaret (goeres ved at markere
mit navn ude i combon vboxen og klikke accepter).
Avatar billede jaxx666 Nybegynder
28. oktober 2008 - 14:46 #7
Hej
Vil lige tilknytte en kommentar til hvordan jeg løste dette problem.
Man kan i access kalde import funktionen vha. følgende vba kode.
Import funktionen er super hurtig i forhold til at importere en fil via alm. vb kode.

Håber nogle kan bruge denne metode

Private Sub Form_Open(Cancel As Integer)
' This executes automatic when opening the Access Database. Avoid Execution by holding down Shift
DoCmd.SetWarnings False
DoCmd.TransferText acImportDelim, "Forsend Import Specification", "forsendelsesdata", "C:\Temp\forsend.txt", False
DoCmd.TransferText acImportDelim, "Afsender Import Specification", "kundetabel", "C:\Temp\afsender.txt", False
DoCmd.TransferText acImportDelim, "Modtager Import Specification", "modtagertabel", "C:\Temp\modtager.txt", False
DoCmd.TransferText acImportDelim, "Users-Afs Import Specification", "users", "C:\Temp\afsender.txt", False
DoCmd.TransferText acImportDelim, "Users-Modt Import Specification", "users", "C:\Temp\modtager.txt", False
DoCmd.SetWarnings True
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