Змінення базового класу TableAdapter у типізованих даних

Дата створення сторінки :

Код для створення та створення введеного набору даних

Введений набір даних дозволяє створювати DataTable, який має тип інформації для кожного стовпця на основі SQL, або TableAdapter, що спрощує взаємодію з даними з БД на основі введеного DataTable.

Оскільки мета полягає не в тому, щоб створити набраний набір даних тут, давайте швидко створити набір даних з БД і таблиці готові на даний момент. Ви також можете зробити все, що ви хочете викласти в таблиці.

Першим кроком є додавання набору даних як нового елемента до вашого проекту. Ім'я нічого, але залишилося тут.

Відкрийте набір даних і додайте TableAdapter з конструктора.

Слідуйте за майстром, щоб створити DataTable і TableAdapter.

Я думаю, що наступна форма може бути прикладом вилучення та використання записів з бази даних за допомогою DataTable і TableAdapter, який ви створили. (Це лише приклад.)

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.金額));
    }
  }
}

Зазвичай проект, який використовує цей набір даних, має менше однієї таблиці, і створюється багато наборів даних, які поєднують кількість таблиць або кілька таблиць. Я думаю, що це звичайна нізація обробки придумати, коли це станеться. Наприклад, ви можете динамічно змінювати SQL, що використовується внутрішньо для зміни умов для отримання записів.

Однак, клас TableAdapter, створені з набору даних фактично автоматично створюється код. Крім того, оскільки цей клас TableAdapter успадковує клас компонента, немає методів або властивостей, які можуть бути використані в реальному загальні. Не можна передати базовий клас методу, щоб зателефонувати до tableadapter, пов'язаної операції.

Крім того, SQL використовується внутрішньо, sqldataadapter використовується для доступу до бази даних і т. д. оголошені в захищеному, так що ви не можете торкнутися їх зовні.

Однак, як ви заявляєте про методи та властивості, заявлені в захищених, ви можете торкнутися їх, створивши клас, який успадковує TableAdapter класу, і цей клас TableAdapter має частковий модифікатор, так що ви можете оголосити інший метод або властивість продовжити процес. Також можна створити нову властивість, щоб отримати внутрішню властивість, як в такому коді:

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

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

Ви дійсно можете використовувати цей TableAdapter, щоб побачити, що у вас є доступ до розширених властивостей.

Однак, доступ до внутрішніх властивостей не означає, що цей процес є загальним, і ви все одно повинні написати код для кожного набору даних, який ви створюєте.

Змінення базового класу TableAdapter

Як уже згадувалося раніше, клас TableAdapter успадковує клас компонентів, що ускладнює надання спільного доступу до даних. Якщо змінити частину коду, який успадковує клас, код автоматично генерується, тому оновлення набору даних знову повертає код. Якщо ви можете, ви можете написати частковий клас, який успадковує інтерфейс в окремому файлі, але це не має сенсу, тому що ви повинні написати стільки TableAdapters, як ви створили.

Насправді, існує механізм для зміни Успадковування класу цього TableAdapter. Я хотів би пояснити цю процедуру.

Спершу створіть клас, який потрібно успадковувати. TableAdapter спочатку успадкували клас компонентів, тому ви повинні успадковувати клас компонентів, навіть якщо ви його створюєте. Я буду писати код, який я хочу поділитися тут, але я просто написати клас. Зіставте простір імен, що ви створили.

using System.ComponentModel;

namespace DataSetBaseAdapter
{
  public class BaseAdapter : Component
  {
  }
}

Потім відкрийте конструктор набору даних і виберіть адаптер, який ви створили.

Клацніть правою кнопкою миші, щоб відкрити властивість. Існує властивість, яка називається базовий клас, який повинен бути спочатку "System. Компонентмодель. компонент". Переписати це клас ви тільки що створили. Я буду писати все, включаючи простір імен.

Якщо ви збережете його, ви побачите, що базовий клас TableAdapter змінився. Встановивши це до кожного TableAdapter, ви можете написати спільну обробку до базового класу.

Наприклад, якщо потрібно отримати доступ до внутрішнього адаптера SQL або SQLDataAdapter, напишіть: Адаптери та групи, які створюються автоматично, є лише властивостями, створеними вибранці класом, тому їх не можна чіпати безпосередньо з вибранці. Наступний код використовує відбиття для примусового доступу.

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

Ви можете бачити, що насправді можна використовувати TableAdapter для доступу до властивостей успадкованого класу.