Cambiar la clase base de un TableAdapter en un DataSet con tipo

Fecha de creación de la página :

Código para crear y generar un Conjunto de datos con tipo

Un DataSet con tipo permite crear un DataTable que tiene información de tipo para cada columna basada en SQL, o un TableAdapter que simplifica la interacción de datos con db basado en una DataTable con tipo.

Puesto que el propósito no es crear un DataSet con tipo aquí, vamos a crear rápidamente un DataSet con la base de datos y la tabla listas para ahora. También puedehacer lo que quiera saque la mesa.

El primer paso es agregar un DataSet como un nuevo elemento al proyecto. El nombre es cualquier cosa, pero se deja aquí.

Abra el DataSet y agregue un TableAdapter desde el diseñador.

Siga el asistente para crear un DataTable y un TableAdapter.

Creo que el siguiente formulario podría ser un ejemplo de recuperación y uso de registros de la base de datos mediante la DataTable y TableAdapter que ha creado. (Esto es sólo un ejemplo.)

public Form1()
{
  InitializeComponent();

  using (var adapter = new 金額集計TestTableAdapter())
  {
    var table = adapter.GetData();

    foreach (var row in table)
    {
      Trace.WriteLine(string.Format("{0}:{1}", row.年月, row.金額));
    }
  }
}

Normalmente, un proyecto que usa este Conjunto de datos tiene menos de una tabla y se crean muchos DataSets que combinan el número de tablas o varias tablas. Creo que es una ización común del procesamiento que se plantea cuando sucede. Por ejemplo, es posible que desee cambiar dinámicamente el SQL utilizado internamente para cambiar las condiciones para recuperar registros.

Sin embargo, el TableAdapter clase creada a partir de la DataSet es realmente generado automáticamente por el código. Además, dado que esta clase TableAdapter hereda la clase Component, no hay métodos ni propiedades que se puedan usar en común. No se puede pasar una clase base a un método para llamar a una operación relacionada con tableadapter.

Además, sql utilizado internamente, sqldataadapter utilizado para tener acceso a la base de datos, etc. se declaran en protegido, por lo que no se puede tocar desde el exterior.

Sin embargo, al declarar para los métodos y propiedades declarados en protected, puede tocarlos creando una clase que hereda la clase TableAdapter y esta clase TableAdapter tiene un modificador parcial, por lo que puede declarar otro método o propiedad para extender el proceso. También puede crear una nueva propiedad para obtener la propiedad interna, como en el código siguiente:

using System.Data.SqlClient;
namespace DataSetBaseAdapter {
    public partial class DataSet1 {
    }
}

namespace DataSetBaseAdapter.DataSet1TableAdapters
{
  public partial class 金額集計TestTableAdapter
  {
    public SqlDataAdapter InnerAdapter
    {
      get { return Adapter; }
    }
  }
}

En realidad, puede usar este TableAdapter para ver que tiene acceso a las propiedades extendidas.

Sin embargo, el acceso a las propiedades internas no significa que el proceso sea común y todavía tiene que escribir código para cada DataSet que cree.

Cambiar la clase base de un TableAdapter

Como se mencionó anteriormente, la clase TableAdapter hereda la clase Component, lo que dificulta compartir el procesamiento. Si cambia la parte del código que hereda una clase, el código se genera automáticamente, por lo que la actualización del conjunto de datos devuelve de nuevo el código. Si puede, puede escribir una clase parcial que herede la interfaz en un archivo independiente, pero no tiene mucho sentido porque tiene que escribir tantos TableAdapters como haya creado.

De hecho, hay un mecanismo para cambiar la clase heredada de este TableAdapter. Me gustaría explicar el procedimiento.

En primer lugar, cree la clase que desea heredar. TableAdapter heredó originalmente la clase Component, por lo que debe heredar la clase Component incluso si la crea. Escribiré el código que quiero compartir aquí, pero escribiré una clase. Haga coincidir el espacio de nombres con lo que ha creado.

using System.ComponentModel;

namespace DataSetBaseAdapter
{
  public class BaseAdapter : Component
  {
  }
}

A continuación, abra el diseñador DataSet y seleccione el TableAdapter que ha creado.

Haga clic con el botón derecho para abrir la propiedad. Hay una propiedad denominada BaseClass, que inicialmente debe ser "System.ComponentModel.Component". Vuelva a escribir esto en la clase que acaba de crear. Escribiré todo, incluido el espacio de nombres.

Si lo guarda, verá que la clase base de TableAdapter ha cambiado. Al establecer esto en cada TableAdapter, puede escribir un procesamiento común en la clase base.

Por ejemplo, si desea tener acceso a un SQL o SQLDataAdapter interno, escriba: Los adaptadores y CommandCollections que se crean automáticamente son solo propiedades creadas por la clase heredoradora, por lo que no se pueden tocar directamente desde el heredero. El código siguiente utiliza la reflexión para forzar el acceso.

using System.ComponentModel;
using System.Data.SqlClient;
using System.Reflection;

namespace DataSetBaseAdapter
{
  public class BaseAdapter : Component
  {
    public SqlDataAdapter InnerAdapter
    {
      get
      {
        return (SqlDataAdapter)GetType().GetProperty("Adapter",
          BindingFlags.NonPublic | BindingFlags.Instance).GetValue(this, null);
      }
    }

    public SqlCommand[] InnerCommandCollection
    {
      get
      {
        return (SqlCommand[])GetType().GetProperty("CommandCollection",
          BindingFlags.NonPublic | BindingFlags.Instance).GetValue(this, null);
      }
    }
  }
}

Puede ver que realmente puede usar el TableAdapter para tener acceso a las propiedades de la clase heredada.