Ik ben op het moment bezig met mijn eerste C++ programma. Ik probeer een progje te maken dat een aantal tabellen van een SQL Server naar een Access database exporteerd (vraag niet waarom
). De code die ik tot nu toe heb werkt wel, maar het probleem is dat mijn hele GUI vertraagt, CPU-usage is 99%, Mem-usage is zo'n 150MB en het exporteren duurt behoorlijk lang. Volgens mij is dit niet echt normaal.
Ik moet hier wel bij vertellen dat het om tabellen gaat die tot 70.000 records bevatten, maar dit moet toch wel kunnen
Mijn kopieer-loop ziet er als volgt uit:
tables[] is een array van strings waarin mijn tabelnamen zijn opgeslagen. De variabele toConn is een verbinding met mijn Access database, fromConn is een verbinding met de SQL Server.
Een ding wat ik zeker weet is dat het aan mijn Access database ligt als ik namelijk
uit mijn code verwijder, dan loopt het programma stukken sneller. Het ligt dus niet aan mijn SQL Server.
Ik heb al een aantal verschillende dingen geprobeerd om de code te verbeteren. Zo heb ik bijvoorbeeld voor de Access database ook een Recordset aangemaakt die via de methode AddNew nieuwe records toevoegd, en de nieuwe records uiteindelijk via batch-updates naar Access schrijft. Maar dat helpt ook niet, de performance werd zelfs nog slechter
Iemand enig idee
Ik moet hier wel bij vertellen dat het om tabellen gaat die tot 70.000 records bevatten, maar dit moet toch wel kunnen
Mijn kopieer-loop ziet er als volgt uit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
| for(int i = 0; i < 34; i++)
{
fromRecordset.CreateInstance (__uuidof (Recordset));
fromRecordset->CursorLocation = adUseClient;
fromRecordset->PutCacheSize(100);
fromRecordset->Open(tables[i],_variant_t((IDispatch *)fromConn,true),adOpenForwardOnly,adLockReadOnly,adCmdTable);
numRecords = fromRecordset->Fields->Count;
while(!(fromRecordset->EndOfFile))
{
CString table = tables[i];
CString query = "INSERT INTO "+table+" VALUES (";
for(columnCount = 0; columnCount < numRecords; columnCount++)
{
vtVal = fromRecordset->Fields->Item[(long)columnCount]->Value;
CString strVal = VarianttToStr(vtVal);
if(columnCount+1 >= numRecords)
query = query+strVal;
else
query = query+strVal+",";
}
fromRecordset->MoveNext();
query = query+");";
toConn->Execute(query.AllocSysString(),NULL,adExecuteNoRecords);
}
m_cProgress.SetPos(5+3*(i-3));
fromRecordset->Close();
} |
tables[] is een array van strings waarin mijn tabelnamen zijn opgeslagen. De variabele toConn is een verbinding met mijn Access database, fromConn is een verbinding met de SQL Server.
Een ding wat ik zeker weet is dat het aan mijn Access database ligt als ik namelijk
code:
1
| toConn->Execute(query.AllocSysString(),NULL,adExecuteNoRecords); |
uit mijn code verwijder, dan loopt het programma stukken sneller. Het ligt dus niet aan mijn SQL Server.
Ik heb al een aantal verschillende dingen geprobeerd om de code te verbeteren. Zo heb ik bijvoorbeeld voor de Access database ook een Recordset aangemaakt die via de methode AddNew nieuwe records toevoegd, en de nieuwe records uiteindelijk via batch-updates naar Access schrijft. Maar dat helpt ook niet, de performance werd zelfs nog slechter
Iemand enig idee