2009-05-04 12 views
2

Welche istSollte AcceptChanges() jedes Mal aufgerufen werden, wenn eine neue Zeile hinzugefügt wird?

while (reader.Read()) 
{ 
    table.Rows.Add(
      new object[] { reader[0], reader[1], reader[2], reader[3] } 
    ); 
    table.AcceptChanges(); 
} 
empfohlen

oder

while (reader.Read()) 
{ 
    table.Rows.Add(
      new object[] { reader[0], reader[1], reader[2], reader[3] } 
    ); 
} 
table.AcceptChanges(); 

Hinweis, wo die table.AcceptChanges platziert wird.


EDIT 1

Hier ist der Code-Block:

protected void Page_Load(object sender, EventArgs e) 
{ 
    IDataReader reader = cust.GetCustomerOrderSummary("99999"); 
    using (DataSet ds = new DataSet()) 
    { 
     using (DataTable table = 
       new DataTable { TableName = "OrderSummary" }) 
     { 
      DataColumn idColumn = table.Columns.Add("number", typeof(int)); 
      table.Columns.Add("name", typeof(string)); 
      table.Columns.Add("quantity", typeof(int)); 
      table.Columns.Add("prev_quantity", typeof(int)); 
      table.PrimaryKey = new DataColumn[] { idColumn }; 
      while (reader.Read()) 
      { 
       table.Rows.Add(
        new object[]{ reader[0], reader[1], reader[2], reader[3] } 
       ); 
       table.AcceptChanges(); 
      } 
      ds.Tables.Add(table); 
      rptCustomerOrder report = 
        new rptCustomerOrder { DataSource = ds }; 
      ReportViewer1.Report = report; 
     } 
    } 
} 

EDIT 2
Nach dem MSDN-Artikel zu lesen here ich beschlossen, den AcceptChanges zu platzieren () außerhalb der Schleife basierend auf den folgenden s (aus dem Artikel):

Wenn AcceptChanges auf der DataTable-Ebene aufgerufen wird, wird die AcceptChanges-Methode für jede DataRow aufgerufen.

+0

Was ist Ihr Tabellenobjekt? – JoshBerke

+0

Was kostet AcceptChanges? Sind es keine Kosten? Dann ist es egal? Wenn die Kosten von AcceptChanges nicht Null sind (d. H. Es braucht Zeit, I/O oder etwas), dann ist es wichtig. –

Antwort

1

Das hängt wirklich davon ab, was Ihr Tabellenobjekt ist und was AcceptChanges macht. Im Allgemeinen würde ich sagen, dass der secodn Ansatz effizienter ist, wenn Sie AcceptChanges nur einmal aufrufen können und es seine Arbeit machen lassen.

Auch dies ist im Allgemeinen, weil ich nicht weiß, mit welchem ​​Objekt Sie tatsächlich zu tun haben. Aber Dinge in Schleifen zu tun ist normalerweise teurer, weil Sie es öfter tun, aber Ihr Tabellenobjekt erfordert möglicherweise, dass Sie Änderungen zwischen den Zeilen akzeptieren. In diesem Fall haben Sie keine Wahl.

+0

Ich habe den Beitrag aktualisiert. –

+0

Tun Sie es danach, sollte etwas effizienter sein; jedoch nach dem Lesen von MSDN. Ich bin nicht sicher, ob Sie diese Methode sogar anrufen müssen – JoshBerke

1

Ich gehe davon aus, AcceptChanges ist, wenn Sie tatsächlich Ihre Daten committen?

Der erste Weg ist in diesem Fall weniger effizient als der zweite, ist aber sicherer, da die Gefahr von Datenverlusten geringer ist, wenn Ihr Lesevorgang irgendwann unterbrochen wird.

+0

Ich dachte dies, aber ich bin nicht vertraut mit der AcceptChanges(), also bin ich mir nicht sicher, ob es innerhalb der Schleife oder außerhalb der Schleife gehen sollte. Sie haben einen Punkt mit dem Verlust von Daten. –

1

Sind Sie sicher, dass Sie die AcceptChanges-Methode überhaupt aufrufen müssen? Ich habe es ähnlich gemacht und ich musste es nie benutzen.

5

Aufruf AcceptChanges nach neuer Zeile hinzugefügt wird tatsächlich die DataRowState Ihre neu drehen hinzugefügt DataRow von Added zu Unchanged. Wenn Sie damit gehen, könnten Sie verlieren die Verfolgung Ihrer neu hinzugefügten Zeilen und zur Zeit der Persistenz. ADO.NET konnte die Zeilen nicht identifizieren, die in der Datenbank eingefügt werden müssen. Also wählen Sie diese Option mit Bedacht, vielleicht brauchen Sie sie nicht einmal.

+0

Aus meinem Verständnis, AcceptChanges markiert die Daten von Interesse als "Unchanged" daher, wenn Sie Daten in einem DataSet ändern, und rufen Sie dann DataSet.AcceptChanges, die alle Daten als Unverändert kennzeichnen, und schließlich das Update dann keine Änderungen sind in der Datenbank gespeichert, sehe ich jedoch nicht die Nützlichkeit von AcceptChanges? Könnten Sie bitte ein ausführliches Beispiel geben? – user1338998

0

Sie rufen Änderungen in der Tabelle an, aber Sie können annehmen, dass Sie acceptchanges für jede einzelne Zeile aufrufen können und somit nur diese Zeile beeinflussen.

dsDataset.Tables ["OrderSummary"]. Zeilen [currentrow] .acceptchanges();

Es hängt wirklich davon ab, was Sie versuchen zu tun. Sie können alle am Ende auf dem Tisch oder einzeln auf jeder Zeile aktualisieren.

Denken Sie auch daran, dass der Aufruf von table acceptchanges den datarowstate in unverändert ändert. Wenn Sie also versuchen, eine Datenbank zu aktualisieren (SQL, Access, ect ...), könnte dies die Datenbank-Updates beeinträchtigen.

Aus Ihrem Beispiel geht hervor, dass Sie diese Tabelle nur für einen Bericht verwenden und daher nicht sicher sind, warum Sie den Datenstatus überhaupt aktualisieren müssen. Nicht sicher, ob der Bericht interessiert ist. Soweit ich weiß, betrifft der acceptchanges/datarowstate nur die Aktualisierung des Backends.

Verwandte Themen