Ayuda muy básica: problemas con TableAdapters y inserciones en tablas con clave

30/01/2008 - 17:44 por José Luis | Informe spam
Hola a todos.

Tengo código que manipula registros en una tabla. Sin problemas.

Suponed una tabla sencilla:
Codigo int (PK, Autoincremental)
Descripcion varchar(256)

El problema real es que cuando inserto un registro en la tabla, .net me
sugiere un valor para la columna pk, pero en realidad, tras el .Update, en
la base de datos se guarda otro registro:


Datarow r = Tabla.NewRow();
r["Descripcion"]="prueba";
[...]
sqlAdapter.Update(r);

//en este punto, si consulto r[0], su valor es, por ejemplo, 2
//pero si hago un select sobre la bbdd, resulta que el valor es, por
ejemplo, 1


Verifico ejecutando un "select IDENT_CURRENT('TABLA')" que la clave real
insertada en la BBDD es 1. El problema me surge ante operaciones de
modificación/borrado sobre ese registro, ya que yo en mi dataset lo tengo
identificado con un valor y en la base de datos se guarda un valor
diferente.

Mi pregunta es: ¿hay alguna manera de recuperar en el dataset los valores
que se la base de datos aporta automáticamente a un registro? (claves
primarias, timestamps, guid, etc)? No quiero tener que volver a cargar toda
la tabla después de cada inserción, y la verdad es que me tiene bastante
preocupado. Llevo un par de días dándole vueltas, pero no encuentro la
solución. :(


¿Alguna idea?


Gracias por adelantado
 

Leer las respuestas

#1 Pedro Luna Montalvo
30/01/2008 - 18:07 | Informe spam
En la configuración del DataAdapter, en las propiedades InsertCommand y
UpdateCommand, deben de recuperar los valores del registro en cuestión
inmediatamente después de la operación, para que estos se actualicen en el
DataTable.

Por ejemplo, para tu caso, el texto del comando de inserción podría ser algo
así:

" insert into MiTabla ( descripcion ) values ( @descripcion ); select
Codigo, Descripcion from MiTabla where Codigo = @@identity "

Con esto, se realiza la inserción, y se actualiza el DataTable en el mismo
comando. Esto es opcional, y solo debe usarse si hay valores que se
modifican o se establecen en el servidor de base de datos, y deben ser
traídos de vuelta al DataTable en el mismo comando de actualización.

Saludos,



"José Luis" escribió en el mensaje de
noticias:
Hola a todos.

Tengo código que manipula registros en una tabla. Sin problemas.

Suponed una tabla sencilla:
Codigo int (PK, Autoincremental)
Descripcion varchar(256)

El problema real es que cuando inserto un registro en la tabla, .net me
sugiere un valor para la columna pk, pero en realidad, tras el .Update, en
la base de datos se guarda otro registro:


Datarow r = Tabla.NewRow();
r["Descripcion"]="prueba";
[...]
sqlAdapter.Update(r);

//en este punto, si consulto r[0], su valor es, por ejemplo, 2
//pero si hago un select sobre la bbdd, resulta que el valor es, por
ejemplo, 1


Verifico ejecutando un "select IDENT_CURRENT('TABLA')" que la clave real
insertada en la BBDD es 1. El problema me surge ante operaciones de
modificación/borrado sobre ese registro, ya que yo en mi dataset lo tengo
identificado con un valor y en la base de datos se guarda un valor
diferente.

Mi pregunta es: ¿hay alguna manera de recuperar en el dataset los valores
que se la base de datos aporta automáticamente a un registro? (claves
primarias, timestamps, guid, etc)? No quiero tener que volver a cargar
toda la tabla después de cada inserción, y la verdad es que me tiene
bastante preocupado. Llevo un par de días dándole vueltas, pero no
encuentro la solución. :(


¿Alguna idea?


Gracias por adelantado

Preguntas similares