Hos Computerworld it-jobbank er vi stolte af at fortsætte det gode partnerskab med folkene bag IT-DAY – efter vores mening Danmarks bedste karrieremesse for unge og erfarne it-kandidater.
som Kabbak siger kan du bruge Docmd.Transfertext som er bygget til hurtig import.
Har du tre felter i din tabel? Er det nummerfelter?
Du kan også læse gennem filen og importere således: (læg denne kode bag en knap).
Dim intFileNo As Integer Dim strLine As String Dim arr() As String Dim db As Database
intFileNo = FreeFile() Open "C:\1.txt" For Input As #intFileNo Set db = CurrentDb ' Læs alle linjer Do While Not EOF(intFileNo) Line Input #intFileNo, strLine arr = Split(strLine, " ") db.Execute ("INSERT INTO tabel1 (felt1,felt2,felt3) VALUES (" & arr(0) & "," & arr(1) & "," & arr(2) & ")"), dbFailOnError Loop
Her er der en jeg bruger, filen er komma separeret Filen omdøbes til en .txt fil inden import Public Function hent()
Dim fil As String, Sti As String Sti = Application.CurrentProject.Path Name Sti & "\New_CARBOE.dat" As Sti & "\New_CARBOE.txt" fil = Sti & "\New_CARBOE.txt" DoCmd.SetWarnings False DoCmd.TransferText acImportDelim, "New_CARBOE importspecifikation", "CARBOE", fil, False, , 865 DoCmd.SetWarnings True Name Sti & "\New_CARBOE.txt" As Sti & "\New_CARBOE.dat" End Function
taio > Du skal have en reference til DAO 3.6 har du det? I VBA-editoren gå da til Tools > Rerences > og find Microsoft DAO 3.6 og vælg den. Kør det så igen. Virker det?
Hvad siger fejlen?
Dette virker hos mig:
Dim intFileNo As Integer Dim strLine As String Dim arr() As String Dim db As Database
intFileNo = FreeFile() Open "C:\1.txt" For Input As #intFileNo Set db = CurrentDb ' Læs alle linjer Do While Not EOF(intFileNo) Line Input #intFileNo, strLine arr = Split(strLine, " ") db.Execute ("INSERT INTO t_status (kode,statusvarenr,statusantal) VALUES (" & arr(0) & "," & arr(1) & "," & arr(2) & ")"), dbFailOnError Loop Erase arr Close #intFileNo
fremfor at bruge db.Execute (...) proev med Docmd.RunSQL(...) Det er en god ide at slukke for advarsler saa du undgaar en popup box for hver linje: docmd.setwarnings(false) docmd.runsql("INSERT INTO t_status (kode,statusvarenr,statusantal) VALUES (" & arr(0) & "," & arr(1) & "," & arr(2) & ")") docmd.setwarnings(true)
For det første slipper man for at "slukke" for advarslerne. Risikoen ved dette er at koden fejl ved en INSERT, hvorefter fejlmeddeleser er slukket i hele databsen.
db.execute med endelsen "dbFailOnError" giver også mere deskriptive fejlmeddelser om f.eks. nøglekonflikter.
og så andre tidligere har skrevet:
"db.Execute may be marginally faster but I doubt it is an observable difference. The *major* difference is that Execute returns trappable JET error if you want to use error-trapping. "
Lige en anden kommentar til dette, selv om det kan ende med at være at lidt akademisk interesse :-)
"It is a good idea to Set db = CurrentDb() because you can then use the RecordsAffected property to find out how many records were added, deleted or modified. Certainly it's somewhat faster to use the Set db ... if you are going to Execute a sequence of action queries.
Note that Execute requires you to resolve any query parameters in your code before executing the query. OTOH, when Access processes the RunSQL method it will take care of the parameters for you.
All this is mostly irrelevant if you really need to improve performance. As far as query performance is concerned you can gain orders of magnitude better improvement by making sure you have all the Join, Where and Order By fields indexed (but don't duplicate the automatic index on a foreign key used in a Relationship). Another important thing is to remove any **unnecessary** keywords such as DISTINCT, etc.
Som nævnet ikke de store hastighedsforskelle på db.execute og Docmd.RunSQL.
Jeg har lige lavet en test med en textfil med 100.000 poster hvor:
... BeginTrans Do While Not EOF(intFileNo) Line Input #intFileNo, strLine arr = Split(strLine, " ") db.Execute ("INSERT INTO t_status (kode,statusvarenr,statusantal) VALUES (" & arr(0) & "," & arr(1) & "," & arr(2) & ")"), dbFailOnError Loop CommitTrans ...
var endnu hurtigere (omkring 30%).
Det skyldes jo at når man 'wrapper' et loop i en transaction, så skrives der først til harddisken når det hele er færdigt, hvorimod derellers skrives 100.000 gange.
OK, mange tak. Godt det virker, ellers skal du være velkommen til at sende noget :-)
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.