Avatar billede skwat Praktikant
24. august 2001 - 09:44 Der 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!
Avatar billede oswald Nybegynder
24. august 2001 - 10:28 #1
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.
Avatar billede terry Ekspert
24. august 2001 - 10:29 #2
if you compress after importing via your program is it the same size as the compressed database importing it via Access?

Avatar billede skwat Praktikant
24. august 2001 - 10:34 #3
oswald:> det kan du have ret i men vi taler om en faktor 41 vi taler om! så det nægter jeg at tro på
Avatar billede terry Ekspert
24. august 2001 - 10:37 #4
try inserting only one record and see how much it grows!
Avatar billede oswald Nybegynder
24. august 2001 - 10:39 #5
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.
Avatar billede terry Ekspert
24. august 2001 - 10:44 #6
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!
Avatar billede oswald Nybegynder
24. august 2001 - 10:52 #7
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
Avatar billede skwat Praktikant
24. august 2001 - 10:54 #8
terry:> after kompresing the database goes from 370mb to 14mb

Avatar billede oswald Nybegynder
24. august 2001 - 10:59 #9
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).
Avatar billede skwat Praktikant
24. august 2001 - 11:02 #10
i får lige hele koden/Here are the whole code:

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
Avatar billede oswald Nybegynder
24. august 2001 - 11:06 #11
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.
Avatar billede terry Ekspert
24. august 2001 - 11:07 #12
If you do have trailng spaces then you can use the Trim() function (I think this exists in VB) to remove them just before inserting.

I dont think there is a BULK insert.

Another solution is to  Automate Access and get a macro or something to import via Access!

But then you could just compress the database from VB!

Avatar billede oswald Nybegynder
24. august 2001 - 11:16 #13
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.


rs(\"field1\") = trim(Mid(Filedata, 4, 11))
rs(\"field9\") = trim(Mid(Filedata, 39, 26))
rs(\"field10\") = trim(Mid(Filedata, 65, 47))
Avatar billede skwat Praktikant
24. august 2001 - 11:16 #14
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?
Avatar billede skwat Praktikant
24. august 2001 - 11:18 #15
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
Avatar billede oswald Nybegynder
24. august 2001 - 11:20 #16
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.
Avatar billede terry Ekspert
24. august 2001 - 11:21 #17
Have you tried using an INSERT into SQL statement.


cn.execut(YourSQL)
Avatar billede oswald Nybegynder
24. august 2001 - 11:23 #18
terry:> I dont think that will help with the size of the database and it might introduce problems with the date.
Avatar billede skwat Praktikant
24. august 2001 - 12:09 #19
hvordan skal den se ud i VB

cn.execut(Mid(Filedata, 4, 11) & \"\',\'\" & etc....... )
eller ?
Avatar billede terry Ekspert
24. august 2001 - 13:24 #20
no, you have to build the sql string up yourself.

INSERT INTO YourTable (field1, field2, .....) VALUES (6, \"text field\", ....) ;


Avatar billede skwat Praktikant
24. august 2001 - 13:30 #21
stupid me offcors i need the insert into statment, i was wondering if i have to use the \'
Avatar billede terry Ekspert
24. august 2001 - 13:58 #22
Not sure waht you mean, but I assume it sin the case of text fields!

For numeric values you just insert the number. For text and dates use \'\' or \"\". I think they both work.


Avatar billede terry Ekspert
24. august 2001 - 13:59 #23
I assume you know how to build you sql string!
Avatar billede oswald Nybegynder
24. august 2001 - 14:03 #24
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.
Avatar billede skwat Praktikant
24. august 2001 - 14:21 #25
terry:> SQL is my 2nd lang.

anyway i have tryed:
****
Dim sqlq As String
        sqlq = \"insert into scan_info(pakkenr,scannr,scandate,kl,region,status,status_rap,handling,memo1,memo2,antal) values(\'\" & _
            pakkenr & \"\',\" & scannr & \",\'\" & scandate & \"\',\'\" & kl & \"\',\'\" & region & \"\',\'\" & status & \"\',\'\" & status_rap & \"\',\'\" & _
            handling & \"\',\'\" & Memo1 & \"\',\'\" & Memo2 & \"\',0)\"
      Debug.Print sqlq
      cn.execut (sqlq)
*****
and the debug window says
insert into scan_info(pakkenr,scannr,scandate,kl,region,status,status_rap,handling,memo1,memo2,antal) values(\'90088791297\',0001,\'14-07-01\',\'0113\',\'008\',\'01\',\'00\',\'A\',\'NIF outbound scan <NOS>  \',\'Ordnungsgem&#8222;á                                \',0)

But my program still pjuke
Avatar billede skwat Praktikant
24. august 2001 - 16:25 #26
here you are - det virkede ikke helt men jeg er på vej
Avatar billede terry Ekspert
28. august 2001 - 11:25 #27
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.

;á                                \',0)

Avatar billede skwat Praktikant
28. august 2001 - 12:19 #28
After using SQL the database grows to above 2GB ;)
Avatar billede terry Ekspert
28. august 2001 - 13:04 #29
2GB?

Avatar billede skwat Praktikant
28. august 2001 - 23:30 #30
jep alot dont you think
Avatar billede terry Ekspert
29. august 2001 - 11:02 #31
So it seems its best to keep to the original method.

How big is the file with 80000 records?

I wouldnt have thought that using a SQL Insert would have had greater overheads than .AddNew and .update
Have you concidered using DAO instead of ADO?
Avatar billede skwat Praktikant
29. august 2001 - 17:11 #32
the file is 9mb big

DAO is\'ent that older?(Not that newer is better)
Avatar billede terry Ekspert
29. august 2001 - 20:13 #33
DAO is well tested, and I think will be around for a while yet!
Avatar billede oswald Nybegynder
30. august 2001 - 09:58 #34
I don\'t think that DAO wil make anything better in this case. The problem is caused by the way Access internaly manipulates the data.
Avatar billede skwat Praktikant
30. august 2001 - 15:32 #35
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é
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