simple side registros muchos example .net optimization datatable dataset

.net - side - ¿Debe llamarse AcceptChanges() cada vez que se agrega una nueva fila?



datatables server side processing example (5)

¿Estás seguro de que necesitas llamar al método AcceptChanges? He hecho algo similar y nunca tuve que usarlo.

Que se recomienda

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

o

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

Tenga en cuenta dónde se coloca la tabla. Aceptar Cambios.

EDIT 1

Aquí está el bloque de código:

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
Después de leer el artículo de MSDN aquí , decidí colocar AcceptChanges () fuera del ciclo basado en la siguiente declaración (del artículo):

Al llamar a AcceptChanges en el nivel DataTable, se llama al método AcceptChanges para cada DataRow.


Esto realmente depende de qué objeto de tabla es y qué está haciendo AcceptChanges. En general, diría que el segundo enfoque es más eficiente si puede llamar a AcceptChanges solo una vez y hacer que haga su trabajo.

De nuevo, esto es en general porque no sé a qué objeto te enfrentas en realidad. Pero hacer cosas dentro de los bucles suele ser más costoso porque lo haces con más frecuencia, pero el objeto de la tabla puede requerir que aceptes cambios entre cada fila, en cuyo caso no tienes otra opción.


Supongo que Aceptar Cambios ¿es cuando realmente comprometes tus datos?

La primera forma es menos eficiente en este caso que la segunda, pero es más segura ya que hay menos posibilidades de que pierda datos si su lectura se interrumpe en algún momento.


Está llamando a aceptar cambios en la tabla, pero tenga en cuenta que puede llamar a aceptar cambios en cada fila individual, lo que solo afecta a esa fila.

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

Realmente depende de lo que estás tratando de hacer. Puede actualizar todo al final de la tabla o individualmente en cada fila.

También tenga en cuenta que al llamar a la mesa acceptchanges cambiará el datarowstate a sin cambios. Por lo tanto, si está tratando de actualizar una base de datos (SQL, Access, ect ...), eso podría interferir con las actualizaciones de la base de datos.

Según su ejemplo, parece que solo está utilizando esta tabla para un informe, por lo tanto, no está seguro de por qué necesitaría actualizar el datarowstate en absoluto. No estoy seguro de que el informe le importe. Hasta donde yo sé, el acceptchanges / datarowstate solo se refiere a la actualización del back-end.


Llamar a AcceptChanges después de agregar una nueva fila realmente convertirá el DataRowState de su DataRow recién agregado de Added to Unchanged . Si lo hace, puede perder el seguimiento de las filas recién agregadas y en el momento de la persistencia. ADO.NET no podría identificar las filas que deben insertarse en la base de datos. Por lo tanto, elija esta opción sabiamente, tal vez ni siquiera lo necesite.