Updaten von TableRows innerhalb von DataSets
-
Hallo!
Ich hätte gerne eine (einzige) von mehreren DataRows in einem DataSet (update) verändert. Ich verwende hierbei die Northwind-Datenbank.
Vielleicht mache ich es auch ganz falsch:
Ich habe den DefaultView.RowFilter = "key='blabla'" gesetzt und wollte dann Row[0] aktualisieren.Das ganze scheitert schon daran, daß der Filter überhaupt nicht anschlägt!
myDataSet.Tables["CUSTOMERS"].DefaultView.RowFilter = "CustomerId like 'ALFKI'";
Ich habe noch immer alle Rows im Table CUSTOMERS ...
Was mach ich denn da falsch?
Und, ist das überhaupt der richtige Weg, eine Row zu aktualisieren?
-
.DefaultView. -> ist ein DataView und keine DataTable, also filterst du mit deiner Anweisung nur im DataView.
Wenn du eine bestimmte Zeile in der DataTable brauchst, benutzte am besten das Property Rows hier findest du dann die Methode Find()
DataTable.Rows.Find( object key )Oder du benutzt die Methode LoadDataRow() hier ein Stück Code wie ich es benutzte.
[cs]
protected virtual void OnReloadRow ( string sqlselect )
{
if ( ( sqlselect != null ) && ( sqlselect != string.Empty ) )
{
System.Data.SqlClient.SqlConnection connection = deine Connection;
if ( connection != null )
{
System.Diagnostics.Debug.WriteLine( sqlselect );if (connection.State == ConnectionState.Closed)
{
connection.Open ();
}
else
{
connection.Close ();
connection.Open ();
}try
{
System.Data.SqlClient.SqlDataReader dr = new System.Data.SqlClient.SqlCommand( sqlselect, connection ).ExecuteReader( System.Data.CommandBehavior.CloseConnection );
try
{
if ( dr.Read() )
{
object[] obj = new object[dr.FieldCount];
dr.GetValues(obj);// DataRow row = ((System.Data.DataTable)this.gridEX1.DataSource).Rows.Find( deine ID );
DataRow row = this.rootDataTable.Rows.Find( dr.GetGuid( dr.GetOrdinal("guid") ) );
if ( row != null )
{
row.ItemArray = obj;
}
else
{
if ( this.gridEX1.DataSource == null )
{
this.gridEX1.SetDataBinding( this.dataset, "RootDataTable" );
}// ((System.Data.DataTable)this.gridEX1.DataSource).LoadDataRow( obj, true );
this.rootDataTable.LoadDataRow( obj, true );
}// Refresh Ansicht
}
}
finally
{
dr.Close( );
}
}
finally
{
connection.Close( );
}
}
}
}
#endregion
[/cs]
-
Vielen Dank für die schnelle Antwort
die ich auch sogleich analysieren werden.
Mit typisierten DataSets soll es ja noch einfacher gehen. Kennst Du Dich da auch aus?
-
Der typisierte DataSet und der normale DataSet sind für deine Aufgabe gleich, sie sind gleich
Ein anderer Weg um Daten zu refreshen ist ein neues DataSet zu laden, die geänderten Zeile per DataAdapter zu laden und dann die Methode Merge(...) des alten DataSet aufzurufen, aber ich mein totaler Overhead.
Ob es im Framework 2 bereits bessere Strategien gibt weiss ich gerad nicht, da ich in meinem aktuellen Projekt mit dem einser noch rumkämpfen muss.
-
Habe mir gerade Deinen Code angesehen. Bei Find allerdings kann man nur einen Primary Key angeben.
Was ist, wenn ich z. b. 5 DataRows (die ebenfalls durch Filterung zusammengestellt worden sind) aktualisieren möchte?
-
Du musst nur die Zeile, denn der DataReader gibt dir per Read() Zeile für Zeile zurück
if ( dr.Read() )
in
while ( dr.Read() )
ändern, wenn du mehrere Zeilen neu einlesen möchtest.
Ich stell nur gerade fest dass ich dir einen ziemlich alten Test Code geschickt habe.
while ( dr.Read() ) { object[] obj = new object[dr.FieldCount]; dr.GetValues(obj); DataRow row = this.rootDataTable.Rows.Find( dr.GetGuid( dr.GetOrdinal("CustomerId") ) ); if ( row != null ) { row.ItemArray = obj; } else { this.rootDataTable.Rows.Add( obj ) }
-
Ist das Arbeiten mit dem SqlDataReader der propate weg, um beispielsweise innerhalb eines DataSets Rows (row=adresse) mit adresse = "Musterweg" umzuändern in "Musterstraße"?
Kann man überhaupt den Inhalt eine DataSets in einen SqlDataReader laden?
-
Vielleich hab ich dich auch misverstanden, geht es darum ein Zeile neu von der Datenbank zuladen oder eine bestimmte zu verändern?
-
Eine oder mehrere bestimmte Datensätze zu ändern ...
-
... aber so wie es üblich ist. Ich weiß ja, wie man SQL-Statements dem SqlDataReader übergibt und ihn dann durch die Ergebnismenge laufen läßt. Aber ist das der probate Weg? Ich meine, wenn man ein DataSet zur Verwaltung von Datensätzen hat, wird man Änderungen über das DataSet machen ... hmmm