Releer un registro en un DataSet

14/02/2008 - 17:26 por Jose Plus42 | Informe spam
Aquí seguimos peleándonos con el C# y el acceso a datos.

Tengo un DataSet sobre el que estoy navegando (con mi BindingSource,
TableAdapter, AdapterManager, BindingNavigator, ...).
La base de datos es SQL Express. En un momento dado lanzo un Stored
Procedure que modifica el registro actual (p.e. recalcula el total de
una factura).
El problema es que no encuentro la forma correcta de refrescar los datos.

Tengo un código parecido a este:

DSEjemplo.FacturasRow row =
DSEjemplo.Facturas[facturasBindingSource.Position];

facturasTableAdapter.RecalculaFactura(row.PK);

tableAdapterManager.UpdateAll(dSEjemplo);

Si abro una nueva ventana veo el total de la factura actualizado (la
llamada a RecalculaFactura funciona ok), pero en la ventana original, da
igual que salga del registro y vuelva a entrar, la tabla en memoria no
se ha enterado del cambio realizado en la base de datos.

¿como haría para obligarle a releer ese registro en concreto?

Al hilo de esto, si yo quiero poner un botón "refrescar" una solución
sería almacenar la posición actual (clave primaria del registro), llamar
al método Fill ( facturasTableAdapter.Fill(dSEjemplo.Facturas); ) y
volver a posicionarme en el registro original. ¿alguna forma mejor de
hacerlo?

Preguntas similare

Leer las respuestas

#1 Jesús López
15/02/2008 - 11:44 | Informe spam
Para releer o refrescar un registro tendrías que utilizar una instrucción
SELECT parametrizada con la clave primaria en la cláusula WHERE. Configuras
un DataAdapter con esa select, estableces el valor de los parámetros y luego
usas el método Fill del dataadapter pasándole el datatable que contiene la
fila a refrescar.

Saludos:

Jesús López



"Jose Plus42" escribió en el mensaje
news:OK$
Aquí seguimos peleándonos con el C# y el acceso a datos.

Tengo un DataSet sobre el que estoy navegando (con mi BindingSource,
TableAdapter, AdapterManager, BindingNavigator, ...).
La base de datos es SQL Express. En un momento dado lanzo un Stored
Procedure que modifica el registro actual (p.e. recalcula el total de una
factura).
El problema es que no encuentro la forma correcta de refrescar los datos.

Tengo un código parecido a este:

DSEjemplo.FacturasRow row =
DSEjemplo.Facturas[facturasBindingSource.Position];

facturasTableAdapter.RecalculaFactura(row.PK);

tableAdapterManager.UpdateAll(dSEjemplo);

Si abro una nueva ventana veo el total de la factura actualizado (la
llamada a RecalculaFactura funciona ok), pero en la ventana original, da
igual que salga del registro y vuelva a entrar, la tabla en memoria no se
ha enterado del cambio realizado en la base de datos.

¿como haría para obligarle a releer ese registro en concreto?

Al hilo de esto, si yo quiero poner un botón "refrescar" una solución
sería almacenar la posición actual (clave primaria del registro), llamar
al método Fill ( facturasTableAdapter.Fill(dSEjemplo.Facturas); ) y volver
a posicionarme en el registro original. ¿alguna forma mejor de hacerlo?
Respuesta Responder a este mensaje
#2 Jose Plus42
15/02/2008 - 12:59 | Informe spam
He añadido a facturasTableAdapter un método FillByPK() con un código
similar a:
selelect pk, <resto de campos> from facturas where (pk=@pk)
Y he cambiado mi código a:

int clave = dSTotal.Facturas[facturasBindingSource.Position].PK;
facturasTableAdapter.RecalculaFactura(clave);
facturasTableAdapter.FillByPK(dSTotal.Facturas, clave);

Haciéndolo así, el problema es que me aparece únicamente ese registro, y
ya no puedo navegar por el resto.



Jesús López escribió:
Para releer o refrescar un registro tendrías que utilizar una instrucción
SELECT parametrizada con la clave primaria en la cláusula WHERE. Configuras
un DataAdapter con esa select, estableces el valor de los parámetros y luego
usas el método Fill del dataadapter pasándole el datatable que contiene la
fila a refrescar.

Saludos:

Jesús López



"Jose Plus42" escribió en el mensaje
news:OK$
Aquí seguimos peleándonos con el C# y el acceso a datos.

Tengo un DataSet sobre el que estoy navegando (con mi BindingSource,
TableAdapter, AdapterManager, BindingNavigator, ...).
La base de datos es SQL Express. En un momento dado lanzo un Stored
Procedure que modifica el registro actual (p.e. recalcula el total de una
factura).
El problema es que no encuentro la forma correcta de refrescar los datos.

Tengo un código parecido a este:

DSEjemplo.FacturasRow row =
DSEjemplo.Facturas[facturasBindingSource.Position];

facturasTableAdapter.RecalculaFactura(row.PK);

tableAdapterManager.UpdateAll(dSEjemplo);

Si abro una nueva ventana veo el total de la factura actualizado (la
llamada a RecalculaFactura funciona ok), pero en la ventana original, da
igual que salga del registro y vuelva a entrar, la tabla en memoria no se
ha enterado del cambio realizado en la base de datos.

¿como haría para obligarle a releer ese registro en concreto?

Al hilo de esto, si yo quiero poner un botón "refrescar" una solución
sería almacenar la posición actual (clave primaria del registro), llamar
al método Fill ( facturasTableAdapter.Fill(dSEjemplo.Facturas); ) y volver
a posicionarme en el registro original. ¿alguna forma mejor de hacerlo?




Respuesta Responder a este mensaje
#3 Jesús López
15/02/2008 - 14:03 | Informe spam
Creo que hay una propiedad de los table adapters que se llama algo así como
ClearBeforeFill. Ponla a false.


"Jose Plus42" escribió en el mensaje
news:%
He añadido a facturasTableAdapter un método FillByPK() con un código
similar a:
selelect pk, <resto de campos> from facturas where (pk=@pk)
Y he cambiado mi código a:

int clave = dSTotal.Facturas[facturasBindingSource.Position].PK;
facturasTableAdapter.RecalculaFactura(clave);
facturasTableAdapter.FillByPK(dSTotal.Facturas, clave);

Haciéndolo así, el problema es que me aparece únicamente ese registro, y
ya no puedo navegar por el resto.



Jesús López escribió:
Para releer o refrescar un registro tendrías que utilizar una instrucción
SELECT parametrizada con la clave primaria en la cláusula WHERE.
Configuras un DataAdapter con esa select, estableces el valor de los
parámetros y luego usas el método Fill del dataadapter pasándole el
datatable que contiene la fila a refrescar.

Saludos:

Jesús López



"Jose Plus42" escribió en el mensaje
news:OK$
Aquí seguimos peleándonos con el C# y el acceso a datos.

Tengo un DataSet sobre el que estoy navegando (con mi BindingSource,
TableAdapter, AdapterManager, BindingNavigator, ...).
La base de datos es SQL Express. En un momento dado lanzo un Stored
Procedure que modifica el registro actual (p.e. recalcula el total de
una factura).
El problema es que no encuentro la forma correcta de refrescar los
datos.

Tengo un código parecido a este:

DSEjemplo.FacturasRow row =
DSEjemplo.Facturas[facturasBindingSource.Position];

facturasTableAdapter.RecalculaFactura(row.PK);

tableAdapterManager.UpdateAll(dSEjemplo);

Si abro una nueva ventana veo el total de la factura actualizado (la
llamada a RecalculaFactura funciona ok), pero en la ventana original, da
igual que salga del registro y vuelva a entrar, la tabla en memoria no
se ha enterado del cambio realizado en la base de datos.

¿como haría para obligarle a releer ese registro en concreto?

Al hilo de esto, si yo quiero poner un botón "refrescar" una solución
sería almacenar la posición actual (clave primaria del registro), llamar
al método Fill ( facturasTableAdapter.Fill(dSEjemplo.Facturas); ) y
volver a posicionarme en el registro original. ¿alguna forma mejor de
hacerlo?



email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida