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

Preguntas similare

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
Respuesta Responder a este mensaje
#2 José Luis
30/01/2008 - 18:15 | Informe spam
"Pedro Luna Montalvo" escribió en el mensaje de
noticias:
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.



Gracias!

¿Uso @@identity o es mejor usar IDENT_CURRENT('TABLA')?
Respuesta Responder a este mensaje
#3 Alberto Poblacion
30/01/2008 - 18:27 | Informe spam
"José Luis" wrote in message
news:
¿Uso @@identity o es mejor usar IDENT_CURRENT('TABLA')?



Tengo entendido que es preferible scope_identity().
http://msdn2.microsoft.com/en-us/li...87342.aspx
Respuesta Responder a este mensaje
#4 José Luis
30/01/2008 - 18:41 | Informe spam
Lo siento pero tu idea no me funciona :(

Cambio la consulta tal y como me dices, ahora el insertcommand del
dataadapter es

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

Cuando ejecuto el DataAdapter.Update(), inserta el registro correctamente,
pero no realiza la actualización, además, tras ejecutar la instrucción, me
cambia automáticamente el insertcommand a

"insert into MiTabla ( descripcion ) values ( @descripcion)"


Es decir, me quita la consulta de actualización.

¿por qué leches me está haciendo esto?


"Pedro Luna Montalvo" escribió en el mensaje de
noticias:
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




Respuesta Responder a este mensaje
#5 José Luis
30/01/2008 - 18:57 | Informe spam
Más pruebas:
He cambiado la propiedad del UpdateRowSource insertcommand

DataAdapter.InsertCommand.UpdateRowSource =
UpdateRowSource.FirstReturnedRecord;

para asegurarme de que el dataadapter actualice el registro, pero además de
truncarme la consulta, el muy capullo, me cambia también esta propiedad a
UpdateRowSource.None !!!!!


??????????????????????
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida