Ik zit hier met een vraagje over de odbcdatareader.
Ik zit hier met een Navision Native database. Deze is dus niet SQL based. Er is wel door microsoft een odbc driver geschreven. Deze driver kan niet alle functies uitvoeren dan een 'echte' odbc driver.
Helaas support deze driver geen .net datasets... Wat ik dus moet doen is:
de DNS test370 is een testomgeving op t bedrijf. Ik heb ook een andere DNS en die wijst naar een lokale kopie van de database. (van vorige maand)
Als ik data ophaal van de lokale database:
Als ik data ophaal van de server database
Als ik dit dus zie betekend dat de Read functie op de server wordt uitgevoerd en dan 1 voor 1 alle records en 1 voor 1 alle velden verstuurd. Enorm slechte performance dus.
Wat ik me dus afvraag wat zie ik over het hoofd. Kan ik het via een andere manier doen
Is er een manier om alle data ineens op te vangen?
Ik zit hier met een Navision Native database. Deze is dus niet SQL based. Er is wel door microsoft een odbc driver geschreven. Deze driver kan niet alle functies uitvoeren dan een 'echte' odbc driver.
Helaas support deze driver geen .net datasets... Wat ik dus moet doen is:
C#:
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
| OdbcConnection myConn = new OdbcConnection(); myConn.ConnectionString = "DSN=test370; //myConn.ConnectionString = "DSN=Sample C/ODBC 32 bit;"; try { //connectie maken Console.WriteLine("Connectie maken " + DateTime.Now); myConn.Open(); Console.WriteLine("Connectie gemaakt " + DateTime.Now); string SQLstring = "SELECT * FROM Productiestuklijstregel"; OdbcCommand myCommand = new OdbcCommand(SQLstring ,myConn); Console.WriteLine("Query uitvoeren " + DateTime.Now); //sql-query uitvoeren OdbcDataReader myReader = myCommand.ExecuteReader(); Console.WriteLine("Query uitgevoerd " + DateTime.Now); //tabel aanmaken Console.WriteLine("Data laten zien " + DateTime.Now); DataTable dTable = new DataTable("List Records"); //kolommen maken for (int fCount = 0; fCount < myReader.FieldCount; fCount++) { dTable.Columns.Add(new DataColumn(myReader.GetName(fCount))); } //data in tabel stoppen DataRow dRow; int i = 0; while (myReader.Read()) { dRow = dTable.NewRow(); for (int k = 0; k < myReader.FieldCount; k++) { dRow[k] = myReader.GetValue(k); } dTable.Rows.Add(dRow); i++; } //data laten zien dataGrid1.SetDataBinding(dTable,null); Console.WriteLine("Data laten zien klaar " + DateTime.Now); Console.WriteLine(dTable.Rows.Count + " records opgehaald"); //connectie verbreken myConn.Close(); } catch (Exception k) { MessageBox.Show(k.ToString()); } |
de DNS test370 is een testomgeving op t bedrijf. Ik heb ook een andere DNS en die wijst naar een lokale kopie van de database. (van vorige maand)
Als ik data ophaal van de lokale database:
uitvoeren van query duurt 11 seconden en 11seconden om de data te laten zien in een datagridConnectie maken 25-4-2006 8:54:28
Connectie gemaakt 25-4-2006 8:54:29
Query uitvoeren 25-4-2006 8:54:29
Query uitgevoerd 25-4-2006 8:54:40
Data laten zien 25-4-2006 8:54:40
'temp.exe': Loaded 'c:\windows\assembly\gac\system.xml\1.0.5000.0__b77a5c561934e089\system.xml.dll', No symbols loaded.
Data laten zien klaar 25-4-2006 8:54:51
8685 records opgehaald
Als ik data ophaal van de server database
uitvoeren van query duurt 5 seconden en data laten zien duurt 1min 13 secondenConnectie maken 25-4-2006 8:57:34
Connectie gemaakt 25-4-2006 8:57:34
Query uitvoeren 25-4-2006 8:57:34
Query uitgevoerd 25-4-2006 8:57:39
Data laten zien 25-4-2006 8:57:39
'temp.exe': Loaded 'c:\windows\assembly\gac\system.xml\1.0.5000.0__b77a5c561934e089\system.xml.dll', No symbols loaded.
Data laten zien klaar 25-4-2006 8:58:52
9319 records opgehaald
Als ik dit dus zie betekend dat de Read functie op de server wordt uitgevoerd en dan 1 voor 1 alle records en 1 voor 1 alle velden verstuurd. Enorm slechte performance dus.
Wat ik me dus afvraag wat zie ik over het hoofd. Kan ik het via een andere manier doen
[This space is for rent]