Ik ben bezig met het testen van een applicatie die een stagiaire heeft gemaakt. En ik vind de performance niet heel geweldig.
Nu is het programma geschreven in C# en daar heb ik dan niet zoveel ervaring mee. Maar het lijkt dat de slechte performance komt door de manier waarop er met de msAccess database wordt gecommuniceerd.
Eerst zal ik even uitleggen wat de applicatie moet doen.
De applicatie zelf staat locaal, de msAccess database staat op het netwerk.
De app. leest Excel bestanden in, stopt die gegevens in de database en de gebruiker heeft de mogelijkheid om (delen van) de data weer te exporteren naar Excel. Via de applicatie kunnen de database gegevens gelezen en eventueel gewijzigd worden.
De data die er inzit bestaat uit drie delen:
Projecten, percelen en monsters. 1 Project kan meerdere percelen hebben en 1 perceel kan meerdere monsters hebben.
Omdat de stagiaire deze week voor het laatst is en er nog wat andere bugs en features moeten worden opgelost, ben ik dit aan het uitzoeken.
Wat er nu gebeurt is dat als een project wordt geselecteerd, er een connectie wordt gemaakt een select statement wordt gestuurd om de gegevens van dat project op te halen (via een command) vervolgens wordt het command EN de connectie gesloten. Vervolgens wordt een nieuwe connectie gemaakt, worden de bijbehorende percelen opgehaald en wordt weer het command en de connectie gesloten en dan wordt weer een nieuwe connectie geopend en de bijbehorende monsters opgehaald en weer de boel gesloten.
Nu lijkt het mij sneller/beter om de connectie open te houden totdat alle data binnen is en dan pas te sluiten. Volgens de stagiaire kan hij geen tweede command sturen bij een nog geopende connectie.
Ik ben dus gaan zoeken op Google en hier en ik kom heel veel voorbeelden tegen waarin maar 1 statement wordt gestuurd, maar niet waar meerdere statements worden gestuurd met dezelfde connectie.
Kan dit werkelijk niet?
Ik zal mijn vraag verduidelijken met enige code:
De regel OleDbDataReader rs2 = myCommand1.ExecuteReader(); (regel 18) geeft problemen omdat de connectie open en fetching is.
Wat ik eigen wil is dat OleDbDataReader rs2 = myCommand1.ExecuteReader(); een recordset terug geeft met alle data waarna ik door die recordset kan loopen.
Dat moet toch kunnen? Waarschijnlijk niet met OleDbDataReader maar waar dan wel mee.
Hopelijk heeft iemand hier een antwoord op of kan iemand mij in de juste richting sturen.
Alvast bedankt.
Nu is het programma geschreven in C# en daar heb ik dan niet zoveel ervaring mee. Maar het lijkt dat de slechte performance komt door de manier waarop er met de msAccess database wordt gecommuniceerd.
Eerst zal ik even uitleggen wat de applicatie moet doen.
De applicatie zelf staat locaal, de msAccess database staat op het netwerk.
De app. leest Excel bestanden in, stopt die gegevens in de database en de gebruiker heeft de mogelijkheid om (delen van) de data weer te exporteren naar Excel. Via de applicatie kunnen de database gegevens gelezen en eventueel gewijzigd worden.
De data die er inzit bestaat uit drie delen:
Projecten, percelen en monsters. 1 Project kan meerdere percelen hebben en 1 perceel kan meerdere monsters hebben.
Omdat de stagiaire deze week voor het laatst is en er nog wat andere bugs en features moeten worden opgelost, ben ik dit aan het uitzoeken.
Wat er nu gebeurt is dat als een project wordt geselecteerd, er een connectie wordt gemaakt een select statement wordt gestuurd om de gegevens van dat project op te halen (via een command) vervolgens wordt het command EN de connectie gesloten. Vervolgens wordt een nieuwe connectie gemaakt, worden de bijbehorende percelen opgehaald en wordt weer het command en de connectie gesloten en dan wordt weer een nieuwe connectie geopend en de bijbehorende monsters opgehaald en weer de boel gesloten.
Nu lijkt het mij sneller/beter om de connectie open te houden totdat alle data binnen is en dan pas te sluiten. Volgens de stagiaire kan hij geen tweede command sturen bij een nog geopende connectie.
Ik ben dus gaan zoeken op Google en hier en ik kom heel veel voorbeelden tegen waarin maar 1 statement wordt gestuurd, maar niet waar meerdere statements worden gestuurd met dezelfde connectie.
Kan dit werkelijk niet?
Ik zal mijn vraag verduidelijken met enige code:
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
| String connectieString = @"Provider=Microsoft.Jet.OLEDB.4.0; Data Source= test.mdb";
System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection(connectieString);
conn.Open();
String query1 = "SELECT * FROM Project";
OleDbCommand myCommand1 = new OleDbCommand(query1);
myCommand1.Connection = conn;
OleDbDataReader rs1 = myCommand1.ExecuteReader();
while(rs1.Read())
{
int projectnr = rs1.GetInt32(rs1.GetOrdinal("projectNr"));
String query2 = "SELECT * FROM Perceel where projectnr=" + projectnr;
OleDbCommand myCommand2 = new OleDbCommand(query2);
myCommand2.Connection = conn;
OleDbDataReader rs2 = myCommand1.ExecuteReader();
while(rs2.Read())
{
int perceelNr = rs2.GetInt32(rs2.GetOrdinal("perceelNr"));
}
} |
De regel OleDbDataReader rs2 = myCommand1.ExecuteReader(); (regel 18) geeft problemen omdat de connectie open en fetching is.
Wat ik eigen wil is dat OleDbDataReader rs2 = myCommand1.ExecuteReader(); een recordset terug geeft met alle data waarna ik door die recordset kan loopen.
Dat moet toch kunnen? Waarschijnlijk niet met OleDbDataReader maar waar dan wel mee.
Hopelijk heeft iemand hier een antwoord op of kan iemand mij in de juste richting sturen.
Alvast bedankt.