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

#6 Pedro Luna Montalvo
30/01/2008 - 19:02 | Informe spam
saludos,

Utiliza SCOPE_IDENTITY() o @@IDENTITY.

Veo que haz puesto @@SCOPE_IDENTITY() en tu código :(
Esto debería darte un error.

saludos,
Pedro Luna


"José Luis" escribió en el mensaje de
noticias:
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
#7 José Luis
30/01/2008 - 19:12 | Informe spam
"Pedro Luna Montalvo" escribió en el mensaje de
noticias:
saludos,

Utiliza SCOPE_IDENTITY() o @@IDENTITY.

Veo que haz puesto @@SCOPE_IDENTITY() en tu código :(
Esto debería darte un error.




jejejeje... es un fallo en la transcripción. Confirmo que estoy usando
SCOPE_IDENTITY()


Saludos
Respuesta Responder a este mensaje
#8 Jesús López
31/01/2008 - 10:28 | Informe spam
En la vista diseño del dataset, pulsa con el botón derecho del ratón en el
table adapter (justo debajo del datatable) y selecciona "Configure". Te sale
un cuadro de diálogo el "TableAdapter Configuration Wizard", pulsa en el
botón "Advanced Options...". Te sale el cuadro de diálogo "Advanced
Options", asegúrate de que tienes activada la opción "Refresh the data
table".

Observa que en la opción "Refresh the data table" dice:

Adds a select statement after Insert and Update statements to retrieve
identity column values, default values, and other values calculated by the
database".


O sea, que no tienes que incluir tú mismo esas instrucciones SELECT para
recuperar los autonuméricos, etc, sino que el propio asistente las genera.

Saludos:

Jesús López
www.solidq.com



"José Luis" escribió en el mensaje
news:
"Pedro Luna Montalvo" escribió en el mensaje de
noticias:
saludos,

Utiliza SCOPE_IDENTITY() o @@IDENTITY.

Veo que haz puesto @@SCOPE_IDENTITY() en tu código :(
Esto debería darte un error.




jejejeje... es un fallo en la transcripción. Confirmo que estoy usando
SCOPE_IDENTITY()


Saludos
Respuesta Responder a este mensaje
#9 José Luis
31/01/2008 - 11:13 | Informe spam
Ya, pero no en todos los casos trabajas con datasets generados por el IDE.

Gracias de todas maneras, creo que ya he encontrado el problema. Lo cuento
en otro post en 1 ratito.
Respuesta Responder a este mensaje
#10 Jesús López
31/01/2008 - 11:27 | Informe spam
Que yo sepa todos los tableadapters son generados por el IDE


"José Luis" escribió en el mensaje
news:
Ya, pero no en todos los casos trabajas con datasets generados por el IDE.

Gracias de todas maneras, creo que ya he encontrado el problema. Lo cuento
en otro post en 1 ratito.




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