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);
###########################################################################################
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);
###########################################################################################