24. august 2001 - 09:44Der er
33 kommentarer og 2 løsninger
Problemmer med ADO
Hej..... Jeg har en stump kode som tilføjer ca. 80000 records fra en ascii fil til en access2000 database. problemmet er at når jeg gør det manuelt(via importere funktionen i access, fylder databasen kun 9 mb, men via mit program kommer databasen til at fylde ca. 370mb. Det skal lige siges at i begge tilfælde sker det på en tom og komprimeret database!
lidt data: VB60 ADO data control 6.0 DataGrid 6.0 Jet 4.0
Lidt kode: tmp = \"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\" & App.Path & \"\\database.mdb;Persist Security Info=False\" cn.Open tmp rs.Open \"Select * from maintrabel\", cn, adOpenDynamic, adLockOptimistic \'Nogle loops og en masse anden pjat
Me.Refresh rs.Update
loop
bare spørg hvis der er noget mere i gerne vil vide!
Det lyder som om det har noget at gøre med Access måde at arbejde på. Når du laver mange individuelle \'insert\'s så bliver det behandlet anderledes end hvis du laver en \'bulk insert\' som inport vist er. Men du burde kunne lave en komprimering af databasen efter de har sat data ind, sådan at du kommer ned på de 9 mb.
skwat:> Det skal du ikke sige. Hvis du sletter en record og indsætter den igen, så bruger access ikke pladsen fra den første record til den anden. Det er hurtigere at ligge den i enden af filen istedet for at erstatte den og jeg mener faktisk at den gør noget i samme stil ved update\'s. Så hvis der sker mange database manipulationer så vokser den meget voldsomt.
skwat> Your code doesnt show exactly HOW your importing into Access, but I asssume that your just looping through the text file and using an \"INSERT INTO ......\" or something like that. Your not deleting and updating at the same time are you? If you are then I agree with oswald. Otherwise it does sound strange. Make sure that all trails spaces are removed from text fields!
terry har måske ret, \"trails spaces\" kan tage meget plads. Men hvad sker der hvis du komprimerer databasen efter du har overført dine data? Kør følgende reallife kode ;)
if (accessdatabase.size <= 9mb) then oswald.GivePoints (60) else terry.msg \"You were right\" oswald.GivePoints (60)\' ;) end if
Det kan godt passe at du har nogle blanke tegn med i dine tekster. Det vil kunne forklarer 5 mb. Hvis du vil prøve at holden den på 9 mb, så kan du undersøge \'Bulk insert\' i access (Jeg ved den findes i SQL serveren).
Private Sub cmdindlaes_Click() Dim rs As ADODB.Recordset Dim Filedata As String Dim Freenum As Variant Dim cn As ADODB.Connection Dim tmp As String Set cn = New ADODB.Connection Set rs = New ADODB.Recordset
\'Åbner forbindelse til Databasen tmp = \"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\" & App.Path & \"\\database.mdb;Persist Security Info=False\" cn.Open tmp \'definere records fra tabellen TABEL rs.Open \"Select * from TABEL\", cn, adOpenDynamic, adLockOptimistic \'******************** Dim a As Long a = 0 Freenum = FreeFile Open txtind.Text For Input As #Freenum Do Until EOF(Freenum) Line Input #Freenum, Filedata \'tæller records a = a + 1 Loop Close #Freenum DGtabel.Visible = False Open txtind.Text For Input As #Freenum lblstatus.Caption = \"Antal records \" & a Dim b As Long b = 0 Do Until EOF(Freenum) Line Input #Freenum, Filedata \'Gør klar til at indsætte en record rs.AddNew rs(\"field1\") = Mid(Filedata, 4, 11) rs(\"field2\") = Mid(Filedata, 15, 4) rs(\"field3\") = Mid(Filedata, 25, 2) & \"-\" & Mid(Filedata, 23, 2) & \"-\" & Mid(Filedata, 21, 2) rs(\"field4\") = Mid(Filedata, 27, 4) rs(\"field5\") = Mid(Filedata, 31, 3) rs(\"field6\") = Mid(Filedata, 35, 2) tmp = Mid(Filedata, 35, 2) If Mid(Filedata, 35, 2) = \"08\" Or _ Mid(Filedata, 35, 2) = \"11\" Or _ Mid(Filedata, 35, 2) = \"12\" Or _ Mid(Filedata, 35, 2) = \"13\" Or _ Mid(Filedata, 35, 2) = \"14\" Or _ Mid(Filedata, 35, 2) = \"21\" Or _ Mid(Filedata, 35, 2) = \"25\" Or _ Mid(Filedata, 35, 2) = \"31\" Then rs(\"field7\") = Mid(Filedata, 35, 2) Else rs(\"field7\") = \"00\" End If rs(\"field8\") = Mid(Filedata, 37, 1) rs(\"field9\") = Mid(Filedata, 39, 26) rs(\"field10\") = Mid(Filedata, 65, 47) rs(\"field11\") = \"0\" b = b + 1 lblstatus.Caption = \"Behandlet \" & b & \" af ialt \" & a & \" records\" Me.Refresh rs.Update Loop Close #Freenum DGtabel.Visible = True rs.Close cn.Close Adodc.Refresh DGtabel.Refresh End Sub
Den eneste forskel er at jeg laver den if sætning tidliger
Det ser ikke ud til at der burde komme nogle blanktegn ind nogle steder. Men jeg tror ikke du skal bekymre dig om de 5 ekstra Mb, med mindre du har store pladsproblemer. Det kan være Index\'er, midlertidige tabeller eller andre underlige access ting.
Det er lidt svært at komme med et bud på hvor du i givet fald skal trimme din tekst når vi ikke kender din datastruktur eller din filstruktur. med et bud ville være.
Jeg er totalt ligeglad med de 5MB men jeg kan ikke leve med de 370mb, det bliver simpelt hent for tungt! alle min mid\'er:) er lavet ud fra en macro som indlæser filen, så den indlæse lige så mange mellemrum.
I har altså ikke noget bud til hvordan jeg kan få den til at behærske sig lidt under indlæsningen? - Er mit eneste alternetiv at komprimere databasen lige efter indlæsning? - hvis ja hvordan får jeg datagridet og adodc til at \"give slip\" uden at unloade formen?
alle mine DATAER har en fast længe undtagen på felt 7 og 6, det vil sige at jeg kan spare 4 tegn på nogle linjer(ca 10%) så det kan ikke forklare den 360mb
Jeg tror ikke du kan få den til at behærske sig, den har sin ejen måde at gøre tingene på. Programmerer du den i VBA eller VB? hvis du er i rent vb burde formen da ikke unloade.
This is the problem with Insert statements as opposed to AddNew. You need to make sure that your dates are in the correct format, your textstring must have \' replaced with \'\', and so on. Plus i don\'t think that it will make any differance in the size problem.
I normaly use stored procedures to handle inputs in the database, but that\'s just me and my SQL server.
skwat> sorry to hear it still doesnt work. What you can do is cut and paste the insert statement from the debug window into a query in Access. This way it should be easier to find the problem.
But looking at the insert you do seem to have a problem at the end! I think this is the value of memo2.
efter at jeg har lavet min if sætning om til en select case er problemmet løst - ingen skal spørge mig hvorfor for jeg har ingen idé
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.