2010-06-25 10 views
5

Cuando uso un SqlCommandBuilder para enviar actualizaciones/inserciones/eliminaciones al servidor ¿necesito llamar al .GetUpdateCommand(), .GetInsertCommand() y .GetDeleteCommand()?¿Se debe llamar a SqlCommandBuilder.GetUpdateCommand() antes de usar SqlDataAdpater.Update()?

using (var adapter = new SqlDataAdapter("select * from MyTable", _connection)) 
using (var builder = new SqlCommandBuilder(adapter)) 
{ 
    adapter.Fill(dt); 

    //Magic happens   

    builder.GetUpdateCommand(); //is this line necessary 
    builder.GetInsertCommand(); //is this line necessary 
    adapter.Update(dt); 
} 

he visto conflictingexamples en lo que es el procedimiento correcto para hacerlo. Sé que funciona sin él, pero no sabía si hacía algo especial detrás de escena. ¿Es esto necesario o es una programación de culto a la carga?

Respuesta

5

Hice algunas pruebas en mi base de datos de prueba para ver si se me ocurría una situación en la que se produciría un error si NO llamaba al GetInsertCommand(). Resulta que puede suceder, en mi caso, sucedió cuando estaba actualizando varias tablas diferentes dentro de una base de datos.

Por alguna razón, al actualizar mi 4ta mesa, no se pudo insertar correctamente. Esto me molestó, así que decidí investigar un poco más, lo que me trajo here. Preste mucha atención a:

Después de generar por primera vez la instrucción Transact-SQL, la aplicación debe llamar explícitamente a RefreshSchema si cambia la declaración de alguna manera. De lo contrario, GetInsertCommand seguirá utilizando información de la declaración anterior, que podría no ser correcta.

Esto me dice que PUEDE funcionar sin llamarlo, pero es mejor llamarlo. Traté de encontrar el razonamiento de por qué a veces funciona, y otras no. Pero no he podido resolverlo por completo.

+0

No NECESITO configurarlos, me preguntaba por qué algunos ejemplos lo hacen. (Ejecutaba mi código sin llamar a los comandos get y actualizaba bien mi servidor). –

Cuestiones relacionadas