Extraño comportamiento de UpdateBatch y ADO

15/06/2008 - 16:44 por MhBeyle | Informe spam
Dejando a un lado las incomodidades deADO, os cuento algo
bastanteextrañoque me sucede con la actualización de un
recordsetADOcargado
con datos de SQL Server. Elcomportamientose reproduce igualmente en
vb 6.0, .NET y en SQL server 2000/2005. No he probado a reproducir el
síntoma en otros lenguajes.
También he leído bastante literatura al respecto de esto y de otros
fallos similares, pero nadie parece haber dado con una respuesta
correcta.

La cadena de conexión que utilizo es la siguiente:

.CursorLocation = adUseClient
.Open "Provider=MSDASQL;" & _
"driver={SQL Server};" & _
"server=" & Srv & ";" & _
"uid=" & uID & ";" & _
"pwd=" & pwd & ";" & _
"database=" & dB & ";"

La conexión del recordset:

.Open CadSQL, cnn_sql, adOpenDynamic, adBatchOptimistic, adCmdText

Y elcomportamientoextraño:

Realizo un .AddNew para que el cliente inserte datos en un formulario
lleno de cuadros de texto con su DataSource ligado al Recordset y sus
respectivos DataFiels ligados a los campos correspondientes.
Terminada la inserción de datos, se realiza un .UpdateBatch
adAffectAll y compruebo, tanto en el programa cliente y el Recordset
como en la traza del servidor que todo se ha realizado correctamente.
Sin problemas en ambos lugares. A excepción de algún problemilla con
un campo Identity que tengo que recuperar con un .Requery, todo bien.

Ahora supongamos que el cliente quiere manipular esos datos. Se abre
el formulario de la misma forma, pero apuntando al registro del
Recordset requerido, lo cual origina que queden rellenos los cuadros
de texto correspondientes. Se manipulan los datos y se acude a la
misma función y la misma órden .UpdateBatchadAffectAll . Compruebo
que los datos se actualizan en el Recordset y en la aplicación. Hago
incluso algún movimiento con .Move y vuelvo al registro manipulado.
Todo perfecto sobre el Recordset. Pero la traza del server no muestra
nada. Ni un miserable intento de acceso y, por supuesto, ni hablar de
un intento de actualización. El .UpdateBatchno genera errores de
ningún tipo. Todo se hace de la misma forma que el añadido de los
datos con .AddNew (incluso se utiliza la misma función), pero cuando
se manipulan datos que ya existen y se quieren grabar, la operación no
se realiza.

He probado con adUseServer y el resultado es similar. He cambiado el
tipo de cursor a Keyset y lo mismo. he probado a cambiar parámetros de
todo tipo y nada. Sencillamente, la operación Update no funciona. Y lo
peor es que no genera errores.

Por supuesto, realizar un Update mediante un sp o una cadena de
conexión funciona sin ningún tipo de problemas.

Me lo expliquen.

MhBeyle ____
 

Leer las respuestas

#1 Victor Koch
17/06/2008 - 17:04 | Informe spam
Hola,

.Open CadSQL, cnn_sql, adOpenDynamic, adBatchOptimistic, adCmdText

Por

.Open CadSQL, cnn_sql, adOpenDynamic, adLockBatchOptimistic, adCmdText


Un Saludo, Víctor Koch



"MhBeyle" escribió en el mensaje
news:
Dejando a un lado las incomodidades deADO, os cuento algo
bastanteextrañoque me sucede con la actualización de un
recordsetADOcargado
con datos de SQL Server. Elcomportamientose reproduce igualmente en
vb 6.0, .NET y en SQL server 2000/2005. No he probado a reproducir el
síntoma en otros lenguajes.
También he leído bastante literatura al respecto de esto y de otros
fallos similares, pero nadie parece haber dado con una respuesta
correcta.

La cadena de conexión que utilizo es la siguiente:

.CursorLocation = adUseClient
.Open "Provider=MSDASQL;" & _
"driver={SQL Server};" & _
"server=" & Srv & ";" & _
"uid=" & uID & ";" & _
"pwd=" & pwd & ";" & _
"database=" & dB & ";"

La conexión del recordset:

.Open CadSQL, cnn_sql, adOpenDynamic, adBatchOptimistic, adCmdText

Y elcomportamientoextraño:

Realizo un .AddNew para que el cliente inserte datos en un formulario
lleno de cuadros de texto con su DataSource ligado al Recordset y sus
respectivos DataFiels ligados a los campos correspondientes.
Terminada la inserción de datos, se realiza un .UpdateBatch
adAffectAll y compruebo, tanto en el programa cliente y el Recordset
como en la traza del servidor que todo se ha realizado correctamente.
Sin problemas en ambos lugares. A excepción de algún problemilla con
un campo Identity que tengo que recuperar con un .Requery, todo bien.

Ahora supongamos que el cliente quiere manipular esos datos. Se abre
el formulario de la misma forma, pero apuntando al registro del
Recordset requerido, lo cual origina que queden rellenos los cuadros
de texto correspondientes. Se manipulan los datos y se acude a la
misma función y la misma órden .UpdateBatchadAffectAll . Compruebo
que los datos se actualizan en el Recordset y en la aplicación. Hago
incluso algún movimiento con .Move y vuelvo al registro manipulado.
Todo perfecto sobre el Recordset. Pero la traza del server no muestra
nada. Ni un miserable intento de acceso y, por supuesto, ni hablar de
un intento de actualización. El .UpdateBatchno genera errores de
ningún tipo. Todo se hace de la misma forma que el añadido de los
datos con .AddNew (incluso se utiliza la misma función), pero cuando
se manipulan datos que ya existen y se quieren grabar, la operación no
se realiza.

He probado con adUseServer y el resultado es similar. He cambiado el
tipo de cursor a Keyset y lo mismo. he probado a cambiar parámetros de
todo tipo y nada. Sencillamente, la operación Update no funciona. Y lo
peor es que no genera errores.

Por supuesto, realizar un Update mediante un sp o una cadena de
conexión funciona sin ningún tipo de problemas.

Me lo expliquen.

MhBeyle ____

Preguntas similares