Alterar a classe base de um TableAdapter em um conjunto de dados digitado

Data de criação de página :

Código para criar e gerar um Conjunto de Dados digitado

Um DataSet digitado permite criar uma Tabela de Dados que tenha informações de tipo para cada coluna com base em SQL ou um TableAdapter que simplifica a interação de dados com db com base em uma Tabela de Dados digitada.

Uma vez que o objetivo não é criar um DataSet digitado aqui, vamos criar rapidamente um DataSet com o banco de dados e a tabela prontas por enquanto. Você também pode fazer o que quiser para colocar a mesa.

O primeiro passo é adicionar um DataSet como um novo item ao seu projeto. O nome é qualquer coisa, mas é deixado aqui.

Abra o Conjunto de Dados e adicione um TableAdapter do designer.

Siga o assistente para criar uma Tabela de Dados e um Adaptador de Tabela.

Acho que o formulário a seguir pode ser um exemplo de recuperação e uso de registros do banco de dados usando o DataTable e tableAdapter que você criou. (Este é apenas um exemplo.)

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, um projeto que usa esse DataSet tem menos de uma tabela e você cria muitos Conjuntos de dados que combinam o número de tabelas ou várias tabelas. Eu acho que é uma comum a tramitação vir à tona quando isso acontecer. Por exemplo, você pode querer alterar dinamicamente o SQL usado internamente para alterar as condições para recuperar registros.

No entanto, a classe TableAdapter criada a partir do Conjunto de Dados é realmente gerada automaticamente pelo código. Além disso, como esta classe TableAdapter herda a classe Componente, não há métodos ou propriedades que possam ser usadas em comum real. Não é possível passar uma classe base para um método para chamar uma operação relacionada ao adaptador de tabela.

Além disso, sql usado internamente, sqldataadapter usado para acessar o banco de dados, etc. são declarados em protegido, de modo que você não pode tocá-los de fora.

No entanto, como você declara para métodos e propriedades declaradas em protegido, você pode tocá-los criando uma classe que herda a classe TableAdapter, e esta classe TableAdapter tem um modificador parcial, para que você possa declarar outro método ou propriedade para estender o processo. Você também pode criar uma nova propriedade para obter a propriedade interna, como no seguinte código:

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

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

Você pode realmente usar este TableAdapter para ver se você tem acesso às propriedades estendidas.

No entanto, acessar propriedades internas não significa que o processo é comum, e você ainda tem que escrever código para cada DataSet que você cria.

Alterar a classe base de um TableAdapter

Como mencionado anteriormente, a classe TableAdapter herda a classe Componente, dificultando o compartilhamento de processamento. Se você alterar a parte do código que herda uma classe, o código será gerado automaticamente, então a atualização do DataSet retorna novamente o código. Se você puder, você pode escrever uma classe parcial que herda interface em um arquivo separado, mas não faz muito sentido porque você tem que escrever quantos TableAdapters você criou.

Na verdade, há um mecanismo para alterar a classe hereditária deste TableAdapter. Gostaria de explicar o procedimento.

Primeiro, crie a classe que você quer herdar. TableAdapter herdou originalmente a classe Componente, então você deve herdar a classe Componente mesmo se você criá-la. Vou escrever o código que quero compartilhar aqui, mas vou escrever uma aula. Combine o namespace com o que você criou.

using System.ComponentModel;

namespace DataSetBaseAdapter
{
  public class BaseAdapter : Component
  {
  }
}

Em seguida, abra o designer DataSet e selecione o TableAdapter que você criou.

Clique com o botão direito do mouse para abrir a propriedade. Existe uma propriedade chamada BaseClass, que inicialmente deve ser "System.ComponentModel.Component". Reescreva isso para a classe que você acabou de criar. Escreverei tudo, incluindo o namespace.

Se você salvá-lo, verá que a classe base do TableAdapter mudou. Ao definir isso em cada TableAdapter, você pode escrever processamento comum para a classe base.

Por exemplo, se você quiser acessar um SQL interno ou SQLDataAdapter, escreva: Adaptadores e Coleções de Comando que são criadas automaticamente são apenas propriedades criadas pela classe herdeira, de modo que não podem ser tocadas diretamente do herdeiro. O código a seguir usa reflexão para forçar o acesso.

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);
      }
    }
  }
}

Você pode ver que você pode realmente usar o TableAdapter para acessar as propriedades da classe herdada.