Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
da.InsertCommand = cmdBuilder.GetInsertCommand()
da.DeleteCommand = cmdBuilder.GetDeleteCommand()
da.UpdateCommand = cmdBuilder.GetUpdateCommand()
VALUES (?,?,?,?,?)
Como puede ver, este comando es directo. Simplemente inserte un nuevo registro y complete su
campos con los argumentos que se pasarán al objeto InsertCommand. El objeto CommandBuilder ha
creado e inicializado convenientemente la colección Parameters,
con cada parámetro apuntando al valor real que tiene la columna correspondiente
en la DataTable
El comando DELETE también es relativamente simple, pero su cláusula WHERE tiene que tener en
cuenta por el hecho de que algunos campos (otros que la clave primaria pub_id) pueden ser nulos cuando
el registro se lee de la base de datos. Entonces no puedes simplemente usar el operador de igualdad,
que por defecto el lenguaje T-SQL evalúa a nulo en lugar de verdadero cuando ambos
los operandos son nulos:
La necesidad de tener en cuenta los valores nulos hace que la sintaxis del comando SQL sea excesiva
Complejo.
El significado de la cláusula WHERE se puede resumir de la siguiente manera: Eliminar la fila
cuyo campo pub_id (la clave principal) es igual al valor proporcionado por el primer parámetro, siempre
que el valor actual en la base de datos para todas las demás columnas sea el mismo
como lo fue cuando el DataTable se llenó con datos de la base de datos. Curiosamente, CommandBuilder
genera este tipo de código para todos los campos de la base de datos, incluidos los que
no son nulos. Cuando un campo no admite nulos, esta precaución es innecesaria, pero no
tener un impacto notable en el rendimiento tampoco.
Aquí hay algunos detalles más sobre el objeto CommandBuilder y algunas de sus limitaciones:
■ La tabla de origen debe incluir una clave principal o al menos una columna con un único
restricción, y el resultado devuelto por la instrucción SELECT debe incluir esa columnas. Las claves
primarias que consisten en columnas múltiples son compatibles.
■ El objeto InsertCommand inserta solo las columnas que son actualizables y omite
correctamente la identidad, la marca de tiempo y las columnas calculadas y, en general, todas
las columnas generadas por el motor de la base de datos.
■ El objeto UpdateCommand utiliza los valores de todas las columnas originales en las
cláusulas WHERE, incluida la clave principal, pero omite correctamente la marca de tiempo y
las columnas calculadas de la cláusula SET.
■ El objeto DeleteCommand usa los valores de todas las columnas originales en el Cláusula
WHERE para ubicar la fila que debe eliminarse.
cmdBuilder.QuoteSuffix = “]”
Tenga en cuenta que CommandBuilder ejecuta el comando SQL asignado al
La propiedad CommandText de SelectCommand para generar los otros tres comandos, por lo que si
luego cambias el comando SELECCIONAR, los comandos de lectura y actualización estarán fuera de
sincronizar Por esta razón, siempre debe invocar RefreshSchema de CommandBuilder
método siempre que modifique la propiedad SelectCommand.
Sin embargo, en algunas aplicaciones, puede ser necesario adoptar una estrategia
diferente para las eliminaciones y decidir eliminar el registro incluso si otro usuario ha
modificado cualquiera de sus campos (que no sean la clave principal). De acuerdo con
esta estrategia, a veces apodada como la estrategia "el último gana uno", la operación
más elegida siempre gana y tiene éxito actualiza el registro (a menos que otro usuario
haya eliminado el registro o cambiado su campo de clave principal). Puede aplicar esta
estrategia simplemente usando solo el campo de clave principal en la cláusula
WHERE. Esta técnica es más rápida y más escalable, pero debe asegurarse que no
invalida la lógica comercial de su aplicación.
Por ejemplo, puede decidir que es legal que un usuario elimine el registro de un autor en
la base de datos Biblio, aunque otro usuario ha modificado los mismos datos del autor en el
mientras tanto. Puede aplicar esta estrategia mediante la fabricación del DeleteCommand
usted mismo:
'Crea un comando de eliminación que filtra los registros solo por su campo Au_ID.
Dim cmdDelete As New OleDbCommand(“DELETE FROM Authors WHERE Au_ID = ?", cn)
'Crea un parámetro y establece sus propiedades.
With cmdDelete.Parameters.Add(“@p1", OleDbType.Integer)
.SourceVersion = DataRowVersion.Original
End With
da.DeleteCommand = cmdDelete
“UPDATE Authors SET Author = ?, [Year Born] = ? WHERE Au_ID = ?", cn)
‘ Add arguments for the SET clause. (They use current field values)
’ Add the argument in the WHERE clause. (It uses the original field value.)
= DataRowVersion.Original
da.UpdateCommand = cmdUpdate
?", cn)
da.DeleteCommand = cmdDelete
& “ SET au_fname = ? , au_lname = ? WHERE au_id = ? AND LastUpdate = ?", cn)
‘ Add arguments for the SET clause, that use the current field value.
‘ Add the arguments in the WHERE clause that use the original field value.
= DataRowVersion.Original
= DataRowVersion.Original
da.UpdateCommand = cmdUpdate