Vous êtes sur la page 1sur 4

Descripcin de la tcnica

El objeto SqlDataAdapter sirve de puente entre un objeto DataSet de ActiveX Data Objects (ADO) .NET y
una base de datos de SQL Server. Se trata de un objeto intermediario que llena un conjunto de datos de
ADO .NET con datos que se recuperan de una base de datos de SQL Server, a continuacin actualiza la base
de datos para reflejar los cambios (como inserciones, actualizaciones y eliminaciones) que se efectan en los
datos mediante el objeto DataSet.
Las propiedades InsertCommand, UpdateCommand y DeleteCommand del
objeto SqlDataAdapter actualizan la base de datos con las modificaciones de datos que se ejecutan en un
objeto DataSet. Estas propiedades son objetos SqlCommandque especifican los comandos INSERT, UPDATE
y DELETE de Transact-SQL que se utilizan para exponer las modificaciones del conjunto de datos en la base
de datos de destino. Los objetos SqlCommand que se asignan a estas propiedades pueden crearse
manualmente en el cdigo o generarse automticamente utilizando el objeto SqlCommandBuilder.
El primer ejemplo de cdigo de este artculo demuestra cmo utilizar el objeto SqlCommandBuilder para
generar de forma automtica la propiedad UpdateCommand del objeto SqlDataAdapter. El segundo
ejemplo utiliza un escenario en el que no se puede utilizar la generacin automtica de comandos, para
demostrar cmo se puede crear y utilizar manualmente un objeto SqlCommand como
propiedad UpdateCommand de un objeto SqlDataAdapter.

Crear la tabla de ejemplo de SQL Server


Para crear una tabla de ejemplo de SQL Server que pueda usar en los ejemplos de cdigo de Visual Basic
.NET que se documentan en este artculo, siga estos pasos:
1. Abra el Analizador de consultas de SQL Server y conctese a la base de datos en la cual desea crear la
tabla de ejemplo. Los ejemplos de cdigo de este artculo utilizan la base de datos Neptuno que
acompaa a SQL Server.
2. Ejecute las siguientes instrucciones de Transact-SQL para crear una tabla de ejemplo llamada CustTest
e inserte un registro en la tabla:
3. Create Table CustTest
4. (
5. CustID int primary key,
6. CustName varchar(20) )
7.
Insert into CustTest values(1,'Juan')

Ejemplo de cdigo n 1: Comandos generados automticamente


Si la instruccin SELECT que utiliza para recuperar los datos que llenan un objeto DataSet se basa en una
nica tabla de base de datos, puede utilizar el objeto CommandBuilder para generar de manera automtica
las propiedades DeleteCommand,InsertCommand y UpdateCommand de DataAdapter. Con ello se
simplifica y se reduce el cdigo que se requiere para efectuar operaciones INSERT, UDPATE y DELETE.
Como requisito mnimo, debe establecer la propiedad SelectCommand con el fin de funcione la generacin
automtica de comandos. El esquema de la tabla que SelectCommand recupera determina la sintaxis de las
instrucciones INSERT, UPDATE y DELETE generadas automticamente.
SelectCommand tambin debe devolver al menos una clave primaria o una columna nica. Si ninguna est
presente, se produce un error de excepcin InvalidOperation y no se generan los comandos.
Para crear una aplicacin de consola de ejemplo de Visual Basic .NET que demuestre cmo utilizar el

objetoSqlCommandBuilder para generar automticamente las


propiedades DeleteCommand, InsertCommand y UpdateCommanddel objeto SqlCommand para un
objeto SqlDataAdapter, siga estos pasos:
1. Cree una nueva aplicacin de consola en Visual Basic .NET.
2. Sustituya el contenido predeterminado de Module1 con el cdigo siguiente:
3. Imports System.Data.SqlClient
4. Imports Console = System.Console
5.
6. Module Module1
7.
8.
Sub Main()
9.
10.
Dim cn As New SqlConnection()
11.
Dim CustomersDataSet As New DataSet()
12.
Dim da As SqlDataAdapter
13.
Dim dr As DataRow
14.
Dim cmdBuilder As SqlCommandBuilder
15.
16.
'Establecer la cadena de conexin del objeto SqlConnection para conectar
con la
17.
'base de datos de SQL Server en la que cre la tabla de ejemplo.
18.
19.
cn.ConnectionString = "Server=.;Database=northwind;UID=sa;PWD=;"
20.
cn.Open()
21.
22.
23.
'Inicializar el objeto SqlDataAdapter especificando un comando Select
24.
'que recupere datos de la tabla de ejemplo.
25.
26.
da = New SqlDataAdapter("select * from CustTest order by CustID", cn)
27.
28.
29.
'Inicializar el objeto SqlCommandBuilder para generar e inicializar
automticamente
30.
'las propiedades UpdateCommand, InsertCommand y DeleteCommand de
SqlDataAdapter.
31.
32.
cmdBuilder = New SqlCommandBuilder(da)
33.
34.
'Llenar el conjunto de datos ejecutando el mtodo Llenar de
SqlDataAdapter.
35.
da.Fill(CustomersDataSet, "Customers")
36.
37.
38.
'Mostrar los comandos Update, Insert y Delete que fueron generados
automticamente
39.
'por el objeto SqlCommandBuilder.
40.
41.
Console.WriteLine("Comando Update generado por el Generador de comandos:
")
42.
Console.WriteLine("======================================================")
43.
Console.WriteLine(cmdBuilder.GetUpdateCommand.CommandText)
44.
Console.WriteLine("
")
45.
46.
Console.WriteLine("Comando Insert generado por el Generador de comandos:
")
47.
Console.WriteLine("=====================================================")
48.
Console.WriteLine(cmdBuilder.GetInsertCommand.CommandText)
49.
Console.WriteLine("
")

50.
51.

Console.WriteLine("Comando Delete generado por el Generador de comandos:


")

52.
53.
54.
55.
56.

Console.WriteLine("=====================================================")
Console.WriteLine(cmdBuilder.GetDeleteCommand.CommandText)
Console.WriteLine("
")

'Escribir el valor en el campo CustName antes de actualizar los datos


mediante DataSet.
57.
Console.WriteLine("Nombre de cliente antes de Update: " &
CustomersDataSet.Tables("Customers").Rows(0)("CustName"))
58.
59.
'Modificar el valor del campo CustName.
60.
CustomersDataSet.Tables("Customers").Rows(0)("CustName") = "Toni"
61.
62.
'Exponer la modificacin del dato en la base de datos.
63.
da.Update(CustomersDataSet, "Customers")
64.
65.
Console.WriteLine("Nombre del cliente actualizado correctamente")
66.
67.
'Cerrar la conexin de la base de datos.
68.
cn.Close()
69.
70.
Console.ReadLine()
71.
72.
End Sub
73.
End Module
74. Guarde y ejecute la aplicacin. Se abrir una ventana de consola y se mostrar el resultado siguiente:
75. Comando Update generado por el Generador de comandos:
76. =====================================================
77. UPDATE CustTest SET CustID = @p1 , CustName = @p2 WHERE ( CustID = @p3 AND
CustName = @p4 )
78.
79. Comando Insert generado por el Generador de comandos:
80. =====================================================
81. INSERT INTO CustTest( CustID , CustName ) VALUES ( @p1 , @p2 )
82.
83. Comando Delete generado por el Generador de comandos:
84. =====================================================
85. DELETE FROM CustTest WHERE ( CustID = @p1 AND CustName = @p2 )
86.
87. Nombre de cliente antes de Update: Juan
88. Nombre de cliente actualizado correctamente
89. Presione una tecla para cerrar la ventana de consola y detener la aplicacin.

Ejemplo de cdigo n 2: Creacin e inicializacin manuales de la propiedad


UpdateCommand
El resultado que el ejemplo de cdigo 1 genera indica que la lgica para generar comandos
automticamente para instrucciones UPDATE se basa en la concurrencia optimista. Es decir, los registros no
estn bloqueados para la edicin y pueden ser modificados por otros usuarios o procesos en cualquier
momento. Dado que es posible que se notifique un registro despus de ser devuelto de la instruccin
SELECT, pero antes de que se emita la instruccin UPDATE, la instruccin UPDATE generada
automticamente contiene una clusula WHERE con el fin de que una fila slo se actualice si contiene todos
los valores originales y no se ha eliminado. Esto se hace as para que no se sobrescriba ningn dato nuevo.
En los casos en los que una actualizacin generada automticamente intenta actualizar una fila que se ha

eliminado o que no contiene los valores originales que se encuentran en DataSet, el comando no afecta a
ningn registro y se genera una excepcinDBConcurrencyException.
Si desea que la instruccin UPDATE se complete independientemente de los valores originales, debe
establecerUpdateCommand para DataAdapter y no basarse en la generacin automtica de comandos.
Para crear e inicializar manualmente la propiedad UpdateCommand del objeto SqlDataAdapter que se
utiliza en el ejemplo de cdigo n 1, siga estos pasos:
1. Sustituya el cdigo existente en Sub Main de Module1 de la aplicacin de consola de Visual Basic .NET
que cre en el ejemplo de cdigo n 1 por lo siguiente:
2. Dim cn As New SqlConnection()
3. Dim CustomersDataSet As New DataSet()
4. Dim da As SqlDataAdapter
5. Dim dr As DataRow
6. Dim DAUpdateCmd As SqlCommand
7.
8.
9. cn.ConnectionString = "Server=.;Database=northwind;UID=sa;PWD=;"
10. cn.Open()
11.
12. da = New SqlDataAdapter("select * from CustTest order by CustID", cn)
13.
14. 'Inicializar el objeto SqlCommand que se utilizar como UpdateCommand de
DataAdapter.
15. 'Observe que la clusula WHERE utiliza nicamente el campo CustID para buscar el
registro que se ha de actualizar.
16.
17. DAUpdateCmd = New SqlCommand("Update CustTest set CustName = @pCustName where
CustID = @pCustId", da.SelectCommand.Connection)
18.
19.
20. 'Crear y anexar los parmetros para el comando Update.
21.
22. DAUpdateCmd.Parameters.Add(New SqlParameter("@pCustName", SqlDbType.VarChar))
23. DAUpdateCmd.Parameters("@pCustName").SourceVersion = DataRowVersion.Current
24. DAUpdateCmd.Parameters("@pCustName").SourceColumn = "CustName"
25.
26. DAUpdateCmd.Parameters.Add(New SqlParameter("@pCustId", SqlDbType.Int))
27. DAUpdateCmd.Parameters("@pCustId").SourceVersion = DataRowVersion.Original
28. DAUpdateCmd.Parameters("@pCustId").SourceColumn = "CustID"
29.
30.
31. 'Asignar la propiedad SqlCommand a la propiedad UpdateCommand de SqlDataAdapter.
32. da.UpdateCommand = DAUpdateCmd
33.
34. da.Fill(CustomersDataSet, "Customers")
35.
36. Console.WriteLine("Nombre de cliente antes de Update: " &
CustomersDataSet.Tables("Customers").Rows(0)("CustName"))
37.
38. CustomersDataSet.Tables("Customers").Rows(0)("CustName") = "Toni"
39. da.Update(CustomersDataSet, "Customers")
40.
41. Console.WriteLine("Nombre del cliente actualizado correctamente")
42.
43. cn.Close()
Console.ReadLine()

Vous aimerez peut-être aussi