LinQ y actualizacion a SQL Server

04/10/2007 - 16:18 por Jose Luis | Informe spam
Disculpen las preguntas reiteradas sobre LinQ en este foro pero es que
estado buscando otro newsgroup en español y no lo he encontrado.

Empece a hacer pruebas del linq de Orcas beta2 con SQL Server 2000 leyendo
una tablita y actualizando una columna de tres columnas, siendo la primera
columna su clave primaria. Me la lee y actualiza muy bien pero la inquietud
es que en el SQL Profiler (herramienta para visualizar los comandos que
'recibe' el servidor) veo que los comandos que recibe desde LinQ son a
traves del procedimiento del servidor "sp_executesql", es decir SQL
dinamico!.

En SQL Server siempre se nos dice que evitemos el SQL dinamico por su
ineficiencia e inseguridad. La pregunta es si LinQ siempre ejecutará sql
dinámico hacia el servidor SQL o hay alguna manera de configurarlo para que
no postee sql dinámico sino instrucciones directas?


La otra cosa extraña que vi fue a pesar de la tablita tener su clave
primaria (campo 'estado'), un update (SubmitChanges) de una fila para
actualizar el campo 'nombre' me puso en el WHERE del Update una comparacion
para todos los campos de la tabla, cuando solo bastaba con preguntar por la
clave primaria.

Me podrian explicar al respecto?


Jose Luis

Preguntas similare

Leer las respuestas

#6 Jose Luis
04/10/2007 - 19:39 | Informe spam
De hecho probe de la forma tradicional con un Command plano sin
parametros:
"update estado set nombre='otro' where estado='2' " y ciertamente en el
profiler lo veo que se envio directamente sin usar el sp_executesql,



¿Y como lo envía directamente?




Lo envia igual como si fuese un comando digitado directamente en el Query
Analizer por ejemplo, o sea que no lo transforma en el servidor de SQL en
una llamada previa al sp_executesql sino que lo toma como un comando
directo. Lo puedes apreciar en el Profiler de SQL.




Yo pensaba que o mandabas SQL dinámico o ejecutabas un procedimiento
almacenado.





Si pero el "SQL dinámico" se divide en dos tipos que no son lo mismo
(generado en el servidor y generado en la aplicación). Del que yo estoy
hablando es del ejecutado en el servidor a traves del store procedure:
sp_executesql o la instruccion EXEC del servidor.

El otro tipo de SQL dinamico es el string que uno arma dinámicamente en la
aplicación y luego lo envia como comando terminado al servidor. Esto es
otra cosa, como se ha visto ya que no siempre produce una llamada intermedia
a sp_executesql (aunque en Linq parece que siempre) sino que queda como un
comando directo que el servidor lo interpreta como fijo.



Saludos





Jose Luis
Respuesta Responder a este mensaje
#7 Juan Diego Bueno
04/10/2007 - 20:34 | Informe spam
Hola José Luis:

La otra cosa extraña que vi fue a pesar de la tablita tener su clave
primaria (campo 'estado'), un update (SubmitChanges) de una fila para
actualizar el campo 'nombre' me puso en el WHERE del Update una
comparacion para todos los campos de la tabla, cuando solo bastaba con
preguntar por la clave primaria.

Me podrian explicar al respecto?



Yo aún no he probado LinQ, pero esa extraña forma de hacer los updates ya se
usa en ado.net desde el principio. Cuando se crea un dataadapter y el IDE
configura automáticamente los comandos de inserción, actualización y
eliminación junto con el selectcommand, crea esas larguísimas y
complejísimas consultas, las cuales como tu bien dices, podrían resoverse
con sólo hacer un update sobre la clave principal. Una posible explicación:
Que quieran dar la posibilidad de poder hacer un update sobre un registro en
el que se pueda cambiar la clave principal.

Este sistema puede provocar conflictos si por ejemplo tienes un trigger que
cambia un dato de la tabla en base a otra relacionada. En mi caso, me
sucedió con una tabla de un histórico que actualizaba unos campos de la
tabla principal mediante un trigger. Lo resolví, como es obvio, cambiando
ese updatecommand y dejando solo en el where la clave principal. Por lo que
veo, siguen utilizando el mismo sistema...

Saludos
Respuesta Responder a este mensaje
#8 Jose Antonio
04/10/2007 - 21:51 | Informe spam
Pero sigue siendo sql dinamico.

"Jose Luis" <x> escribió en el mensaje de noticias
news:
De hecho probe de la forma tradicional con un Command plano sin
parametros:
"update estado set nombre='otro' where estado='2' " y ciertamente en el
profiler lo veo que se envio directamente sin usar el sp_executesql,



¿Y como lo envía directamente?




Lo envia igual como si fuese un comando digitado directamente en el Query
Analizer por ejemplo, o sea que no lo transforma en el servidor de SQL en
una llamada previa al sp_executesql sino que lo toma como un comando
directo. Lo puedes apreciar en el Profiler de SQL.




Yo pensaba que o mandabas SQL dinámico o ejecutabas un procedimiento
almacenado.





Si pero el "SQL dinámico" se divide en dos tipos que no son lo mismo
(generado en el servidor y generado en la aplicación). Del que yo estoy
hablando es del ejecutado en el servidor a traves del store procedure:
sp_executesql o la instruccion EXEC del servidor.

El otro tipo de SQL dinamico es el string que uno arma dinámicamente en la
aplicación y luego lo envia como comando terminado al servidor. Esto es
otra cosa, como se ha visto ya que no siempre produce una llamada
intermedia a sp_executesql (aunque en Linq parece que siempre) sino que
queda como un comando directo que el servidor lo interpreta como fijo.



Saludos





Jose Luis

Respuesta Responder a este mensaje
#9 Jose Luis
04/10/2007 - 22:16 | Informe spam

Pero sigue siendo sql dinamico.





Para el servidor no.


Jose Luis
Respuesta Responder a este mensaje
#10 Octavio Hernandez
04/10/2007 - 22:20 | Informe spam
Veo que los comandos que recibe desde LinQ son a traves del procedimiento
del servidor "sp_executesql", es decir SQL dinamico!.





No sé bien a qué le llamas SQL dinámico, para mí SQL dinámico es cuando la
sentencia se forma a partir de concatenaciones de cadenas, algunas de las
cuales contienen valores (posiblemente introducidos por el usuario). A
diferencia de eso, en el SQL parametrizado todos los valores se suministran
a través de parámetros. TODAS las sentencias q LINQ to SQL genera son
parametrizadas, para evitar inyección de SQL.

...me puso en el WHERE del Update una comparacion para todos los campos
de la tabla,




cuando solo bastaba con preguntar por la clave primaria.

Por defecto, todas las columnas participan en la comprobación de
concurrencia optimista. Pero eso se puede modificar. Copio textualmente:

"La comprobación de si la fila ha sido modificada después que se leyó o no
se lleva a cabo, como es natural, comparando los valores originales de las
columnas de esa fila con los actuales. Una columna se utilizará o no en esta
comprobación en dependencia del valor que se asigne al parámetro UpdateCheck
del atributo Column asociado a la columna en la clase de entidad. Los
posibles valores son UpdateCheck.Always (utilizar la columna siempre, el
valor por defecto), UpdateCheck.Never (no utilizar la columna en las
comprobaciones) y UpdateCheck.WhenChanged (utilizarla solo cuando el valor
de la columna haya sido modificado)."

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