Performance OleDbDataAdapter.Update() and status?

  • Thread starter Thread starter Michael Brockhoff
  • Start date Start date
M

Michael Brockhoff

Hello NG,

i have here a functon wich I use to restore a certain state of
a DataTable. Its working but you might find some points where i could get better performance.
With MS SQL Server this funktion is fast enough for me (it takes for a DataTable with 10000 Rows about 1-2
seconds...

But if i use Access in the OleDbConnection performance drops dramaticly! Now the same thing
takes about 20 seconds!
I had this Problem allready earlier and resolved it using ADODB.

2 Qestions:
1) Do you have any sugestions how to improve Performance?
The most time consumes the OleDbDataAdapter.Update() funktion...

2) Is their any way to get a status how far the Update is? To show a progress bar?


Regrards

Michael


the rollback function: (sorry for german commennts but i guess you will get it...)
#######################################################################
/// <summary>
/// Mit der OledDbConnection wird die eingestellte Datenbank
/// geöffnet.
/// In dem DataSet _dsRollback sind die Tables enthalten die wiederhergestellt werden soll.
/// 1) Den Jeweiligen DataTable von der Datenbank abrufen
/// 2) alle DataRows löschen
/// 3) die DataRows der Sicherung in den DataTable hinienkopieren
/// 4) Alles OK dann speichern! (falls vorher eine Exception ausgelöst wird muss die vom Aufrufer
/// per try catch gehandelt werden.
/// 5) Nächste Table und alles fängt von vorne an...
/// </summary>
/// <param name="conn"></param>
/// <returns></returns>
public void RollBack(OleDbConnection conn){
foreach(DataTable xTable in this._dsRollBack.Tables){
DataTable orginalTable = new DataTable(xTable.TableName);
OleDbDataAdapter adapter = FillDataTable(orginalTable, conn);
// Orginal Daten löschen
foreach(DataRow xRow in orginalTable.Rows){
xRow.Delete();
}

// Jetzt die Rows von der Sicherung hineinkopieren
foreach(DataRow xRow in xTable.Rows){
DataRow newRow = orginalTable.NewRow();
foreach(DataColumn xColumn in newRow.Table.Columns){
newRow[xColumn.ColumnName] = xRow[xColumn.ColumnName];
}
orginalTable.Rows.Add(newRow);
}

// und Änderungen im Server speichern
adapter.Update(orginalTable);
}
}
#########################################################################



the ADOB how i used it earlier (sorry again for german commennts but i guess you will get it...)
##############################################################################
// jetzt geht es weiter mit ADODB da "jet" performace
// Probleme mit ADO.NET hat. Bei wechsel auf MSDE muss
// Das hier wieder umgestellt werden auf SQL...

ADODB.Connection adoConn = new ADODB.Connection();
ADODB.Recordset adoRS = new ADODB.Recordset();


adoConn.Open(ConfigurationSettings.AppSettings["_strGeraeteParameterConnectionString"], "", "", -1);
adoRS.Open("SELECT * FROM "+_strGeraet, adoConn, ADODB.CursorTypeEnum.adOpenForwardOnly,
ADODB.LockTypeEnum.adLockBatchOptimistic,1);

object[] Fieldlist = new object[8];
object[] Values = new object[8];

Fieldlist[0] = "ID";
Fieldlist[1] = "Name";
Fieldlist[2] = "Sende_Bytes";
Fieldlist[3] = "Sende_Werte";
Fieldlist[4] = "Empfangs_Werte";
Fieldlist[5] = "Default_Werte";
Fieldlist[6] = "Typ";
Fieldlist[7] = "Kommentar";

Values[0] = "160.";
Values[1] = "Parameter der Positionen";
Values[2] =Values[3] =Values[4] =Values[5] =Values[6] =Values[7] = null;
adoRS.AddNew(Fieldlist, Values);
adoRS.UpdateBatch(ADODB.AffectEnum.adAffectCurrent);
###########################################################################################
 
1- When you call update, the adapter loops through each row, checks the
rowstate and fires the corresponding command if one is available. So for
each row changed, that's a trip to the db. That will be changed in ADO.NET
2.0 but for now that's the behavior. Access as far as I know doesn't
support batch updates anyway so AFAIK, I don't see a opening to improve
performance greatly.

2- YOu can trap OnRowUpdating and each time it's raised, that's when an
attempt is made to update the row.OnRowUpdated will work as well. This will
walk you through it http://www.knowdotnet.com/articles/reponsiveui.html

--
W.G. Ryan, MVP

www.tibasolutions.com | www.devbuzz.com | www.knowdotnet.com
Michael Brockhoff said:
Hello NG,

i have here a functon wich I use to restore a certain state of
a DataTable. Its working but you might find some points where i could get better performance.
With MS SQL Server this funktion is fast enough for me (it takes for a
DataTable with 10000 Rows about 1-2
seconds...

But if i use Access in the OleDbConnection performance drops dramaticly! Now the same thing
takes about 20 seconds!
I had this Problem allready earlier and resolved it using ADODB.

2 Qestions:
1) Do you have any sugestions how to improve Performance?
The most time consumes the OleDbDataAdapter.Update() funktion...

2) Is their any way to get a status how far the Update is? To show a progress bar?


Regrards

Michael


the rollback function: (sorry for german commennts but i guess you will get it...)
#######################################################################
/// <summary>
/// Mit der OledDbConnection wird die eingestellte Datenbank
/// geöffnet.
/// In dem DataSet _dsRollback sind die Tables enthalten die wiederhergestellt werden soll.
/// 1) Den Jeweiligen DataTable von der Datenbank abrufen
/// 2) alle DataRows löschen
/// 3) die DataRows der Sicherung in den DataTable hinienkopieren
/// 4) Alles OK dann speichern! (falls vorher eine Exception ausgelöst wird muss die vom Aufrufer
/// per try catch gehandelt werden.
/// 5) Nächste Table und alles fängt von vorne an...
/// </summary>
/// <param name="conn"></param>
/// <returns></returns>
public void RollBack(OleDbConnection conn){
foreach(DataTable xTable in this._dsRollBack.Tables){
DataTable orginalTable = new DataTable(xTable.TableName);
OleDbDataAdapter adapter = FillDataTable(orginalTable, conn);
// Orginal Daten löschen
foreach(DataRow xRow in orginalTable.Rows){
xRow.Delete();
}

// Jetzt die Rows von der Sicherung hineinkopieren
foreach(DataRow xRow in xTable.Rows){
DataRow newRow = orginalTable.NewRow();
foreach(DataColumn xColumn in newRow.Table.Columns){
newRow[xColumn.ColumnName] = xRow[xColumn.ColumnName];
}
orginalTable.Rows.Add(newRow);
}

// und Änderungen im Server speichern
adapter.Update(orginalTable);
}
}
#########################################################################



the ADOB how i used it earlier (sorry again for german commennts but i guess you will get it...)
############################################################################
##
// jetzt geht es weiter mit ADODB da "jet" performace
// Probleme mit ADO.NET hat. Bei wechsel auf MSDE muss
// Das hier wieder umgestellt werden auf SQL...

ADODB.Connection adoConn = new ADODB.Connection();
ADODB.Recordset adoRS = new ADODB.Recordset();
adoConn.Open(ConfigurationSettings.AppSettings["_strGeraeteParameterConnecti
onString"], "", "", -1);
adoRS.Open("SELECT * FROM "+_strGeraet, adoConn, ADODB.CursorTypeEnum.adOpenForwardOnly,
ADODB.LockTypeEnum.adLockBatchOptimistic,1);

object[] Fieldlist = new object[8];
object[] Values = new object[8];

Fieldlist[0] = "ID";
Fieldlist[1] = "Name";
Fieldlist[2] = "Sende_Bytes";
Fieldlist[3] = "Sende_Werte";
Fieldlist[4] = "Empfangs_Werte";
Fieldlist[5] = "Default_Werte";
Fieldlist[6] = "Typ";
Fieldlist[7] = "Kommentar";

Values[0] = "160.";
Values[1] = "Parameter der Positionen";
Values[2] =Values[3] =Values[4] =Values[5] =Values[6] =Values[7] = null;
adoRS.AddNew(Fieldlist, Values);
adoRS.UpdateBatch(ADODB.AffectEnum.adAffectCurrent);
############################################################################
###############
 
Back
Top