TableAdapters en Visual Studio 2005

Visual Studio 2005

Septiembre de 2005

Publicado: 21 de Noviembre de 2005

Por Jay Hickerson
Microsoft Corporation

Resumen: Visual Studio 2005 amplía el acceso a datos con tipos mediante TableAdapter, un nuevo objeto que simplifica enormemente la interacción con objetos de datos en el equipo cliente y el envío de actualizaciones a una base de datos. (19 páginas impresas.)

En esta página

Introducción Introducción
Descripción general Descripción general
Generación de TableAdapters Generación de TableAdapters
El código de TableAdapter El código de TableAdapter
Creación de instancias de TableAdapter Creación de instancias de TableAdapter
Columnas de DataTable Columnas de DataTable
Compatibilidad con Null Compatibilidad con Null
Métodos directos de base de datos Métodos directos de base de datos
Métodos Fill y GetData Métodos Fill y GetData
Compatibilidad con varias consultas Compatibilidad con varias consultas
El TableAdapter de consultas El TableAdapter de consultas
Más información sobre consultas escalares Más información sobre consultas escalares
Actualización de la base de datos Actualización de la base de datos
DataObjectAttribute DataObjectAttribute
Cadenas de conexión Cadenas de conexión
Personalización y ampliación Personalización y ampliación
Referencia rápida de las propiedades de TableAdapter Referencia rápida de las propiedades de TableAdapter
Conclusión Conclusión

Introducción

En Visual Studio 2003, los desarrolladores tenían un determinado número de componentes de acceso a datos. Sin embargo, combinar estos componentes era, a menudo, tedioso y no fomentaba una buena reutilización de los objetos. En Visual Studio 2005, hemos ampliado el acceso a datos con tipo mediante un nuevo objeto llamado TableAdapter. Con los TableAdapters, interactuar con los objetos de datos en el equipo cliente y enviar actualizaciones a una base de datos resulta mucho más sencillo. Los TableAdapters encapsulan los objetos necesarios para comunicarse con una base de datos y proporcionar métodos para realizar el acceso a los datos con tipos seguros.

Descripción general

Los objetos TableAdapter no se encuentran en el .NET Framework. A diferencia de los datasets con tipo, que se heredan de la clase System.Data.DataSet, los TableAdapters son enteramente generados por Visual Studio utilizando el modelo de datos creado con el Asistente para la configuración de orígenes de datos o en el Diseñador de Dataset.

Los TableAdapters abstraen el tipo de base de datos del código de la aplicación. Por ejemplo, imaginemos que ha desarrollado su aplicación utilizando una base de datos de Oracle. Más adelante decide trasladar esa base de datos a Microsoft SQL Server. En Visual Studio 2002 y Visual Studio 2003, hubiese tenido que cambiar los tipos de objetos que estaba utilizando para realizar el acceso a la base de datos. Puede que los OracleDataAdapters se hayan convertido en SqlDataAdapters y los objetos OracleConnection se habrán convertido en objetos SqlConnection. Todos los comandos que haya creado deberán cambiarse también. Con los TableAdapters, el trabajo más pesado se realiza automáticamente. Basta con cambiar la cadena de conexión y regenerar el dataset para regenerar el TableAdapter con el mismo nombre y la misma interfaz. Internamente, el código del TableAdapter se regenerará para utilizar los objetos de SQL adecuados en vez de los objetos de Oracle.

La abstracción se crea en dos partes. La primera parte es el Common Language Runtime (CLR) para la conversión de tipos de base de datos que ocurre en el interior del TableAdapter. Como los lenguajes de programación .NET no contienen de forma nativa tipos de datos para el acceso a la base de datos, se crea una asignación entre el tipo de la columna de la base de datos y un tipo del CLR. Al crear esta asignación, un TableAdapter puede exponer métodos y propiedades asociados con las columnas de la base de datos a los que el código puede obtener acceso directamente. Por ejemplo, una base de datos de Oracle puede contener una columna con el tipo varchar2. El TableAdapter asignará este tipo a una cadena en las propiedades y los métodos expuestos. Si posteriormente decide utilizar una base de datos creada con Microsoft SQL Server en su lugar, el mismo campo de la base de datos de SQL Server será de tipo nvarchar pero la interfaz de TableAdapter seguirá utilizando la cadena de tipo para columna.

La segunda parte de la abstracción es la encapsulación de los objetos de la base de datos encontrados en las versiones anteriores de Visual Studio. En el TableAdapter se encuentran encapsulados un DataAdapter, un objeto de conexión y una matriz de objetos de comandos. Los objetos de comandos se exponen públicamente mediante llamadas a métodos de manera que para cada objeto de comando hay un método público en el TableAdapter. Estos objetos de comandos se exponen como consultas de TableAdapter en el esquema del dataset.

Un punto que hay que tener en cuenta en todo esto es que puede que tenga que modificar las instrucciones SQL para que sigan la sintaxis de la nueva base de datos. El lugar más habitual en el que se encontrará esto es en los nombres de los parámetros. En el ejemplo anterior, todos los parámetros utilizados en las instrucciones de Oracle originales se cambiarán de :ParamName a @ParamName para que pueda reconocerlos SQL Server

Generación de TableAdapters

El código correspondiente a un TableAdapter se genera después de agregar un TableAdapter a un dataset. Hay varias maneras de agregar un TableAdapter a un dataset:

  • Utilizar el Asistente para la configuración de orígenes de datos

  • Arrastrar un objeto de base de datos desde el Explorador de servidores (Explorador de base de datos en las ediciones Express y Standard de Visual Studio 2005) sobre el Diseñador de Dataset

  • Arrastrar desde el cuadro de herramientas hasta el Diseñador de Dataset

  • Hacer clic con el botón secundario en el Diseñador de Dataset y elegir Agregar nuevo TableAdapter en el menú contextual

Si se utiliza el Asistente para la configuración de orígenes de datos o se arrastra desde el Explorador de servidores se creará un TableAdapter configurado con los valores predeterminados. Una tabla habitual de una base de datos incluirá una instrucción select con un aspecto similar a SELECT CustomerID, ContactName, ContactName, Address, City, Region, PostalCode, Phone FROM Customers. Si se arrastra un TableAdapter desde el cuadro de herramientas o se agrega uno mediante el menú contextual del diseñador de dataset se creará un nuevo TableAdapter sin configurar y se iniciará el Asistente para la configuración de TableAdapter. Los siguientes pasos muestran un recorrido básico por el Asistente para la configuración de TableAdapter:

En el Asistente para la configuración de TableAdapter, se le preguntará si quiere utilizar una conexión a una base de datos o desea crear una nueva:

Una vez que haya creado una conexión, se le preguntará si desea guardar la cadena de conexión en el archivo de configuración de la aplicación o quiere que se genere en el código. (Esta opción no aparecerá en los proyectos de C++ ni de dispositivos inteligentes, ya que no admiten los archivos de configuración con tipos seguros. Por el contrario, la cadena de conexión siempre se generará en el código.)

A continuación, se le pedirá que elija el tipo de comando del TableAdapter. Las opciones consisten en utilizar una instrucción SQL, crear un nuevo procedimiento almacenado o utilizar un procedimiento almacenado existente:

Tras elegir el tipo de comando que desea utilizar, se le mostrarán las páginas adecuadas para que configure el tipo de comando que ha elegido. Por brevedad, no seguiremos todos los recorridos posibles del asistente, pero si opta por utilizar una instrucción SQL, se le mostrará la siguiente página:

Si hace clic en el botón Opciones avanzadas en la página Instrucción SQL aparecerán opciones que permiten controlar el modo de generar las instrucciones SQL adicionales. Puede elegir si desea que se generen las instrucciones Insert, Update y Delete de escritura en la base de datos correspondientes a la instrucción select (Generar instrucciones Insert, Update y Delete), si desea que las instrucciones update y delete no surtan efecto si otro usuario ya ha modificado el registro (Usar concurrencia optimista) y si desea actualizar un DataTable después de una instrucción Insert o Update adjuntando una sentencia select al final del comando (Actualizar la tabla de datos):

Tras configurar el comando SQL, se le preguntará si desea generar métodos para Fill y GetData, y se le ofrecerá la posibilidad de generar métodos DBDirect que se pueden utilizar para insertar, actualizar y eliminar registros de la base de datos directamente sin utilizar una DataTable (volveremos a esto más adelante):

La última página del asistente muestra un resumen de lo que se generará con el código de TableAdapter. Esta página también mostrará todos los errores que se hayan detectado durante el proceso de creación del TableAdapter:

El código de TableAdapter

El código para todo el dataset, incluido los TableAdapters, se almacenará en el directorio de proyecto con la siguiente convención de denominación de archivos:

<Nombre de dataset>.Designer.<Extensión de lenguaje>

Por ejemplo, si tiene un dataset llamado NorthwindDataSet en el proyecto de Visual Basic, el archivo de código se llamará NorthwindDataSet.Designer.vb.

Además del archivo de código del diseñador, también hay un archivo .xsc que almacena las preferencias de las interfaces de usuario (UI) que ha seleccionado en la ventana Orígenes de datos y un archivo .xss que almacena la información sobre el diseñador y los objetos (como su ubicación y su tamaño). Puede que también haya un archivo .vb donde puede colocar su propio código. El archivo .vb se genera la primera vez que selecciona el comando Ver código en el menú contextual Diseñador de Dataset. Este archivo se utiliza para almacenar el código de validación de dataset y otros métodos y propiedades de clase parcial asociados con el dataset y las DataTables.

En el Explorador de soluciones, los archivos aparecerán anidados en el archivo DataSet.xsd. Puede ver los archivos ampliando el nodo DataSet.xsd. Según el perfil que utilice, es posible que estos archivos estén ocultos. Si no ve los archivos, en la barra de herramientas del Explorador de soluciones, haga clic en Mostrar todos los archivos y, a continuación, expanda el nodo DataSet.xsd. Si hace doble clic en cualquiera de los archivos, se abrirá en el editor adecuado.

El código del archivo del diseñador se regenera cada vez que se realiza un cambio en el dataset correspondiente. Se sobrescribirán todas las modificaciones realizadas en este archivo la próxima vez que se genere el archivo. Si desea modificar o ampliar un TableAdapter, la mejor manera de hacerlo es mediante una clase parcial en un archivo de código independiente que se agregue al proyecto. Más adelante veremos un ejemplo de ampliación de un TableAdapter mediante una clase parcial en Personalización y ampliación .

Una vez que se ha abierto el archivo de código del diseñador, encontrará los TableAdapters colocados en un espacio de nombres independiente. Por ejemplo, si el dataset se llama NorthwindDataSet, los TableAdapters se colocarán en el espacio de nombres NorthwindDataSetTableAdapters, lo que separa los TableAdapters de los demás objetos del dataset. El propio dataset se coloca en el espacio de nombres raíz del proyecto y contiene clases anidadas para cada DataTable y tipo de fila asociados con el dataset.

Creación de instancias de TableAdapter

En los proyectos de Windows Forms, es posible generar instancias de TableAdapter en un formulario arrastrando la correspondiente DataTable o cualquiera de sus columnas desde la ventana Orígenes de datos hasta el formulario. También se pueden generar en un formulario arrastrando un objeto TableAdapter con tipo desde el cuadro de herramientas.

Si está escribiendo una aplicación que no dispone de interfaz de usuario gráfica o prefiere no utilizar el diseñador de formularios, también es posible crear instancias de TableAdapters mediante código.

Visual Basic

Dim CustomersTableAdapter As New 
NorthwindDataSetTableAdapters.CustomersTableAdapter()

C#

NorthwindDataSetTableAdapters.CustomersTableAdapter 
customersTableAdapter = new 
NorthwindDataSetTableAdapters.CustomersTableAdapter();

Para utilizar el TableAdapter para que rellene una DataTable:

Visual Basic

Dim NorthwindDataSet as new NorthwindDataSet()CustomersTableAdapter.Fill(NorthwindDataSet.Customers)

C#

NorthwindDataSet northwindDataSet = new NorthwindDataSet(); 
customersTableAdapter.Fill(northwindDataSet.Customers);

Al arrastrar objetos desde la ventana Orígenes de datos hasta el formulario, se genera código similar a éste para el controlador de eventos Form_Load.

Columnas de DataTable

Al crear un TableAdapter en el diseñador, también se crea la correspondiente DataTable. Esta DataTable corresponde al esquema de la consulta predeterminada. La consulta predeterminada la crea el usuario en Asistente para la configuración de TableAdapter o la crea automáticamente Visual Studio mediante Asistente para la configuración de orígenes de datos o al arrastrar un objeto desde el Explorador de servidores hasta el Diseñador de Dataset. Al ver el TableAdapter en el diseñador, la consulta predeterminada es siempre la consulta superior y el icono que aparece junto a la consulta tiene una marca de verificación en la esquina superior izquierda:

Si se cambia la consulta predeterminada también cambiará la DataTable asociada al TableAdapter.

Compatibilidad con Null

Los TableAdapters utilizan el nuevo tipo genérico, Nullable, para ofrecer total compatibilidad con los parámetros de tipos seguros. A continuación, vemos la firma de función generada para la función Insert de un OrdersTableAdapter simplificado:

Visual Basic

Public Overloads Overridable Function Insert(ByVal CustomerID As String, _
    ByVal EmployeeID As System.Nullable(Of Integer), ByVal OrderDate As _
    System.Nullable(Of Date)) As Integer

C#

public virtual int Insert(string CustomerID,
    System.Nullable<int> EmployeeID,
    System.Nullable<System.DateTime> OrderDate)

Ambas columnas EmployeeID y OrderDate tienen el tipo Nullable ya que las columnas correspondientes de la base de datos Northwind permiten valores nulos. Puede llamar a la función Insert pasando Nothing (null en C#) en lugar de parámetros de tipos seguros en vez de configurar una propiedad diferente o utilizar otro mecanismo más voluminoso para indicar que los campos son nulos.

Visual Basic

OrdersTableAdapter.Insert("NEW", Nothing, Nothing)

C#

ordersTableAdapter.Insert("NEW", null, null);

Además de utilizar Nullable en las columnas con tipos seguros, el código generado para el TableAdapter también comprueba si se ha utilizado null en las columnas de tipo de cadena que no admiten entradas nulas en la base de datos. El siguiente código generado muestra un ejemplo de cómo se realiza esta comprobación:

Visual Basic

If (CustomerID Is Nothing) Then
    Throw New System.ArgumentNullException("CustomerID")
Else
    Me.Adapter.UpdateCommand.Parameters(0).Value = CType(CustomerID,String)
End If

C#

if ((CustomerID == null)) {
    throw new System.ArgumentNullException("CustomerID");
}
else {
    this.Adapter.InsertCommand.Parameters[0].Value = ((string)(CustomerID));
}

Como puede ver en el código anterior, si se pasa null para un parámetro de cadena que no puede ser nulo, se genera una excepción ArgumentNull.

Puede cambiar cómo trata el TableAdapter los valores nulos modificando el atributo AllowDBNull en columnas concretas de la DataTable asociada. Si esta propiedad está establecida en true, los parámetros son de tipo Nullable. Si está establecida en false, los parámetros tienen el tipo correspondiente al campo de la base de datos que representan.

La configuración predeterminada de AllowDBNull está determinada por el origen de la DataTable. Para las tablas de la base de datos, AllowDBNull se establece teniendo en cuenta si cada columna de la base de datos admite valores nulos. Para instrucciones Transact-SQL, se establece AllowDBNull en false para todas las columnas. Para los procedimientos almacenados, AllowDBNull es de manera predeterminada true para todas las columnas.

Un punto que hay que señalar es que las consultas seguirán necesitando un tratamiento especial de los valores nulos de la tabla. Por ejemplo, si desea poder seleccionar los elementos nulos del campo Region de la tabla Customers, deberá escribir una consulta similar a la siguiente:

SELECT * FROM Customers WHERE Region=@Region OR (Region IS NULL AND @Region IS NULL)

Métodos directos de base de datos

Además de los métodos de actualización de DataTable que ofrecen los TableAdapters, tiene también la posibilidad de generar métodos que escriban directamente en la base de datos, sin necesidad de modificar una DataTable y enviarla a la base de datos. Esta opción se controla mediante la propiedad GenerateDBDirectMethods del objeto TableAdapter del Diseñador de Dataset. Los métodos DBDirect que se generan son Insert, Delete y una sobrecarga de Update que admite un parámetro de tipo seguro para cada campo de la DataTable.

Métodos Fill y GetData

Al crear un nuevo TableAdapter, se ofrecen dos métodos para recuperar datos de una base de datos en una DataTable. El método Fill acepta una DataTable existente y un parámetro y la rellena. El método GetData devuelve una nueva DataTable que se ha llenado.

Fill es una manera cómoda de rellenar una DataTable que ya existe. Por ejemplo, si utiliza una instancia de DataSet en su aplicación, puede rellenar los miembros de DataTable del dataset pasándolos a fill.

Al llamar al método Fill, se comprobará el valor de la propiedad ClearBeforeFill del TableAdapter. Si esta propiedad está establecida en true, se llama al método Clear de la DataTable antes de rellenarla. Si la propiedad está establecida en false, no se llamará al método Clear. En este último caso, las filas de la DataTable se combinarán con las filas de la base de datos. El valor predeterminado de ClearBeforeFill es true.

GetData es útil si todavía no dispone de una instancia de DataTable. Por ejemplo, tal vez quiera implementar la funcionalidad de búsqueda en una tabla de la base de datos. Puede agregar un método al TableAdapter que devuelva una nueva instancia de DataTable que contenga únicamente los elementos que cumplan los criterios de búsqueda.

Compatibilidad con varias consultas

Cada TableAdapter puede tener varias consultas asociadas. Dentro del TableAdapter estas consultas se almacenan como una matriz de objetos de comandos y se obtiene acceso a ellas mediante llamadas a métodos con tipos seguros en el TableAdapter.

Si se agrupan las consultas con el mismo esquema, las operaciones comunes se pueden encapsular en un TableAdapter. Por ejemplo, si suele filtrar una tabla con varios criterios diferentes puede agregar consultas para cada uno de estos criterios. Puede que tenga las siguientes dos consultas:

SELECT * FROM Customers WHERE CustomerID=@CustomerID
SELECT * FROM Customers WHERE Region=@Region

Cada consulta a la que se obtiene acceso llamando a un método del TableAdapter toma los parámetros adecuados y rellena una DataTable. A continuación, se muestran las firmas de función para los métodos Fill y GetData creados para cada una de estas consultas.

Visual Basic

Public Overloads Overridable Function FillByCustomerID( _
    ByVal dataTable As NorthwindDataSet.CustomersDataTable, _
    ByVal CustomerID As String) As Integer
Public Overloads Overridable Function GetDataByCustomerID( _
    ByVal CustomerID As String) As NorthwindDataSet.CustomersDataTable

C#

public virtual int FillByCustomerID(
    NorthwindDataSet.CustomersDataTable dataTable, string CustomerID)
public virtual NorthwindDataSet.CustomersDataTable GetDataByCustomerID(
    string CustomerID)

Visual Basic

Public Overloads Overridable Function FillByRegion( _
    ByVal dataTable As NorthwindDataSet.CustomersDataTable, _
    ByVal _Region As String) As Integer
Public Overloads Overridable Function GetDataByRegion( _
    ByVal_Region As String) As NorthwindDataSet.CustomersDataTable

C#

public virtual int FillByRegion(
    NorthwindDataSet.CustomersDataTable dataTable, string Region)
public virtual NorthwindDataSet.CustomersDataTable GetDataByRegion(
    string Region)

El esquema de la DataTable asociado al TableAdapter queda determinado por el esquema de la consulta predeterminada. Sin embargo, no tiene que limitarse a crear consultas que correspondan al esquema del TableAdapter. Por ejemplo, puede agregar una consulta escalar para obtener un recuento de todos los clientes. Si selecciona la opción "SELECT which returns a single value" en TableAdapter Query Configuration Wizard y, a continuación, escribe SELECT COUNT(*) FROM Customers como instrucción SQL, se agregará una nueva consulta al TableAdapter. Esta consulta utilizará el objeto de conexión asociado al TableAdapter, pero devolverá un valor escalar en vez de los datos de la tabla.

El TableAdapter de consultas

Además de los TableAdapters con DataTables asociadas, hay un TableAdapter especial que contiene las consultas globales del dataset que devuelven valores únicos. El nombre predeterminado de este TableAdapter es QueriesTableAdapter pero, al igual que todos los TableAdapter, puede cambiar su nombre. A las consultas que contiene este TableAdapter se obtiene acceso de la misma manera que a las consultas de los demás TableAdapters, pero con una diferencia: en vez de crear los métodos Fill y GetData, sólo se genera un método. Este método tendrá un valor de devolución adecuado que coincidirá con el valor de devolución de la consulta.

Visual Basic

Dim myQueries As New NorthwindDataSetTableAdapters.QueriesTableAdapter()
customerCount = myQueries.CustomerCount()

C#

NorthwindDataSetTableAdapters.QueriesTableAdapter myQueries;
customerCount = myQueries.CustomerCount().value;

Los TableAdapters también realizan un tratamiento inteligente de las consultas con parámetros de salida. Por ejemplo, si tiene un procedimiento almacenado llamado Output que acepta un parámetro de salida, los parámetros del método del TableAdapter asociado se pasarán por referencia:

Visual Basic

Public Overloads Overridable Function Output( _
    ByRef p1 As System.Nullable(Of Integer))

C#

public virtual int Output(ref System.Nullable<int> p1)

Al llamar al método, se pasa p1 al procedimiento almacenado como parámetro de comando, se ejecuta el procedimiento almacenado y el valor del parámetro de comando modificado se vuelve a colocar en p1. En el código puede utilizar este parámetro de la misma manera que utilizaría cualquier otro parámetro de referencia.

Más información sobre consultas escalares

En ocasiones, es posible que quiera recuperar un determinado valor de una fila de la tabla como si fuera un valor escalar. Puede hacerlo con los TableAdapters creando una consulta escalar que devuelva únicamente una columna. El valor de devolución de la función generada será un objeto que puede convertir al tipo correcto. Por ejemplo, si desea obtener el número de teléfono de un determinado cliente, puede agregar una consulta escalar al TableAdapter que sea similar a la siguiente:

SELECT Phone FROM Customers WHERE CustomerID=@CustomerID

La función generada devolverá un objeto (que puede convertir en una cadena) que contendrá el número de teléfono de la primera fila de la tabla:

Visual Basic

Dim phone As String
Dim customerTableAdapter As
    New NorthwindDataSetTableAdapters.CustomersTableAdapter()

phone = CType(customerTableAdapter.CustomerPhone("BOLID"), String)

C#

string phone;
NorthwindDataSetTableAdapters.CustomersTableAdapter customersTableAdapter = 
    new WindowsApplication2.NorthwindDataSetTableAdapters.CustomersTableAdapter();

phone = (string)customersTableAdapter.CustomerPhone("BOLID");

En este caso, sólo se devolverá una fila ya que CustomerID es un campo único. NOTA: este comportamiento no es específico de los TableAdapters. El DataAdapter subyacente proporciona esta funcionalidad. Sin embargo, los TableAdapters han sido diseñados para aprovechar este comportamiento y generar funciones que devuelvan un único valor.

De manera similar, puede agregar consultas Insert, Update y Delete que no devuelvan ningún dato, pero que actúen sobre la misma tabla de la base de datos que las consultas select.

Actualización de la base de datos

La manera más habitual de actualizar una base de datos es enviar los cambios que contienen uno o varios objetos DataTable a la base de datos. TableAdapters proporciona varias sobrecargas del método Update para facilitar esta tarea. Cada una de estas sobrecargas reenvía el parámetro pasado al método Update del DataAdapter subyacente. A continuación, vemos un ejemplo de cómo llamar a update pasando una DataTable de un dataset con tipo:

Visual Basic

customersTableAdapter.Update(northwindDataSet.Customers)

C#

customersTableAdapter.Update(northwindDataSet.Customers);

DataObjectAttribute

Si utiliza un TableAdapter como un objeto de origen de datos en un proyecto Web, verá que el ObjectDataSource Wizard detecta que el método GetData está disponible para operaciones select y que los métodos Update, Insert y Delete están disponibles para las operaciones update, insert y delete, respectivamente. Este asistente es capaz de descubrir estos métodos en el TableAdapter ya que cada uno tiene un DataObjectAttribute aplicado en el código del TableAdapter. Para cada método de datos del TableAdapter, el atributo se aplica con la propiedad methodType establecida en el valor apropiado (Fill, Select, Insert, Update o Delete).

Cadenas de conexión

Visual Studio 2005 presenta como novedad los valores de configuración con tipo a los que se puede obtener acceso mediante programación. Los TableAdapters aprovechan esta característica para ofrecer las cadenas de conexión almacenadas en el archivo app.config de la aplicación. Si se utiliza una cadena de conexión almacenada como una configuración con tipo, puede cambiar la cadena de conexión del archivo app.config y todos los TableAdapters de la aplicación se conectarán a la base de datos utilizando la nueva cadena de conexión.

El uso de valores de configuración con tipo presenta la ventaja adicional de proporcionar valores predeterminados si no se puede encontrar el valor de configuración en el archivo app.config. En vez de generar una excepción, la clase de valores de configuración generada devuelve el valor que se estableció durante la compilación. Para TableAdapters, se utilizará la cadena de conexión utilizada para desarrollar la aplicación cuando no se encuentre ningún otro valor para la cadena de conexión.

Personalización y ampliación

Los TableAdapters se pueden personalizar y ampliar de varias maneras mediante el Diseñador de Dataset y escribiendo su propio código. A continuación, podemos ver algunas técnicas y propiedades utilizadas para personalizar los TableAdapters.

Cambio de la herencia

No hay un objeto base TableAdapter en el .NET Framework. En su lugar, los TableAdapters heredan de System.ComponentModel.Component cuando se crean. Sin embargo, puede cambiar los TableAdapters para que hereden de la clase base que prefiera estableciendo la propiedad BaseClass en el Diseñador de Dataset.

Es importante señalar que una de las clases de la cadena de herencia debe heredar de System.ComponentModel.Component de manera que el TableAdapter se pueda arrastrar a un Windows Form.

Modificación de la accesibilidad del TableAdapter y su conexión

La accesibilidad predeterminada de los TableAdapters es pública. Puede restringir el acceso a los TableAdapters desde los componentes exteriores cambiando la propiedad Modifier del TableAdapter en el Diseñador de Dataset.

De manera similar, puede compartir la conexión que utiliza un TableAdapter cambiando la propiedad ConnectionModifier del TableAdapter en el Diseñador de Dataset. De forma predeterminada, el modificador de conexión está establecido en Friend. Es una buena idea dejar este modificador establecido en el valor predeterminado para impedir que objetos desconocidos puedan utilizar la conexión (y posiblemente las credenciales) para consultar la base de datos.

Ampliación del TableAdapter con clases parciales

Cada clase de TableAdapter se declara como parcial en el código generado. Las clases parciales ofrecen una manera de ampliar una determinada clase agregando métodos a la clase en varios archivos de código. Para los TableAdapters, es importante escribir las clases parciales en un archivo aparte respecto al código generado para que Visual Studio no sobrescriba las clases al regenerar el código del TableAdapter. (El código de TableAdapter se regenera en cualquier momento en que se realicen cambios a un dataset en el Diseñador de Dataset.)

Para agregar una clase parcial al proyecto, en el Explorador de soluciones, haga clic con el botón secundario en el nodo de proyecto y seleccione Agregar->Clase. A continuación, podrá agregar el código al nuevo archivo de clase. El siguiente ejemplo muestra cómo agregar una sobrecarga al método Delete directo de la base de datos que acepta una fila en vez de los parámetros individuales para cada campo:

Visual Basic

Namespace NorthwindDataSetTableAdapters
   Partial Public Class CustomersTableAdapter
      Public Overloads Function Delete( _
        ByVal row as NorthwindDataSet.CustomersRow) As Integer
         Return Me.Delete(row.CustomerID, row.CompanyName, row.ContactName, _
              row.Address, row.City, row._Region, row.PostalCode, row.Phone)
      End Function
   End Class
End Namespace

C#

namespace WindowsApplication3.NorthwindDataSetTableAdapters
{
    public partial class CustomersTableAdapter
    {
        public int Delete(NorthwindDataSet.CustomersRow row)
        {
            return this.Delete(row.CustomerID, row.CompanyName,
                row.ContactName, row.ContactTitle, row.Address, row.City,
                row.Region, row.PostalCode, row.Country, row.Phone,
                row.Fax);
        }
    }
}

Hay dos puntos importantes que se deben señalar. El primero es que la clase se declara en el espacio de nombres TableAdapter. El segundo es que hay que marcar la clase como parcial. Mediante estas dos acciones, se estará indicando al compilador que se está ampliando la clase CustomersTableAdapter existente en vez de crear una nueva clase con el mismo nombre en el espacio de nombres raíz.

Referencia rápida de las propiedades de TableAdapter

.

Generación de código

Base Class

Clase de la que heredará el TableAdapter. Es importante que los TableAdapters hereden de System.Component.ComponentModel para que se puedan arrastrar al Form Designer.

ConnectionModifier

Visibilidad externa del objeto de conexión que utiliza el TableAdapter

Modifier

Visibilidad externa del TableAdapter

Nombre

Nombre del TableAdapter.

.

Datos

Connection

Información utilizada para generar el objeto de conexión de la conexión de la base de datos. Aquí es donde se establece la cadena de conexión.

GenerateDBDirectMethods

Propiedad booleana que indica si se deben generar métodos que permitan enviar comandos directamente a la base de datos, sin utilizar las DataTables.

InsertCommand, SelectCommand, UpdateCommand, DeleteCommand

Configuración para los objetos System.Data.DbCommand subyacentes que se utilizan para obtener los datos y enviar los cambios a la base de datos.

CommandText

Texto del comando que se ejecutará en la base de datos. Según el tipo de comando, este texto puede ser una instrucción SQL, un nombre de procedimiento almacenado o un nombre de función.

CommandType

Tipo de comando que representa el texto del comando. Esta propiedad puede ser Text, Stored Procedure o TableDirect.

Parámetros

Colección de parámetros que debe utilizarse al llamar al comando.

Conclusión

Los TableAdapters facilitan en gran medida el acceso a los proveedores de bases de datos y ofrecen una manera con tipos seguros de ejecutar comandos en la base de datos. Gracias a las clases parciales y a la herencia, es posible ampliarlos para que lleven a cabo prácticamente cualquier tarea que sea necesaria. En este artículo, hemos visto de manera general las características de los TableAdapters y cómo interactúan con los otros elementos del proyecto. Con estas características puede aprovechar la funcionalidad de TableAdapter para crear rápidamente objetos de acceso a base de datos con grandes posibilidades de reutilización.

Mostrar: