Промяна на основния клас на TableAdapter в типнанабор от данни

Дата на създаване на страница :

Код за създаване и генериране на нанети данни

Напечатан dataset ви позволява да създадете DataTable, която съдържа информация за типа за всяка колона, базирана на SQL, или TableAdapter, която опростява взаимодействието с данни с DB въз основа на въведена 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.金額));
    }
  }
}

Обикновено проект, който използва този набор данни има по-малко от една таблица и създавате много datasets, които комбинират броя на таблици или няколко таблици. Мисля, че е обща изация на обработката, която трябва да се появи, когато това се случи. Например, може да искате да промените динамично SQL, използван вътрешно за промяна на условията за извличане на записи.

Обаче TableAdapter клас, създаден от DataSet всъщност автоматично се генерира от кода. Също така, защото този 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, за да видите, че имате достъп до разширени свойства.

Достъпът до вътрешни свойства обаче не означава, че процесът е често срещан и все още трябва да пишете код за всеки DataSet, който създавате.

Промяна на основния клас на TableAdapter

Както бе споменато по-горе, TableAdapter клас наследява класа компонент, което затруднява споделянето на обработка. Ако промените част от кода, която наследява клас, кодът се генерира автоматично, така че актуализирането на DataSet отново връща кода. Ако можете, можете да напишете частичен клас, който наследява интерфейс в отделен файл, но няма много смисъл, защото трябва да напишете толкова TableAdapters, колкото сте създали.

Всъщност има механизъм за промяна на наследяването на класа на този TableAdapter. Бих искал да обясня процедурата.

Първо създайте класа, който искате да наследявате. TableAdapter първоначално наследява клас компонент, така че трябва да наследява класа компонент, дори ако го създадете. Ще напиша кода, който искам да споделя тук, но аз просто ще напиша един клас. Съпоставяте пространството на имената с това, което сте създали.

using System.ComponentModel;

namespace DataSetBaseAdapter
{
  public class BaseAdapter : Component
  {
  }
}

След това отворете дизайнера на dataSet и изберете TableAdapter, който сте създали.

Щракнете с десния бутон, за да отворите имота. Има свойство, наречено BaseClass, което първоначално трябва да бъде "System.ComponentModel.componentComponent". Пренапишете това в класа, който току-що създадохте. Ще напиша всичко, включително и пространството на имената.

Ако го запишете, ще видите, че базовият клас на TableAdapter е променен. Чрез задаване на това за всеки TableAdapter, можете да напишете обща обработка на основния клас.

Например, ако искате да получите достъп до вътрешен SQL или SQLDataAdapter, пишете: Адаптерите и CommandCollection, които се създават автоматично, са само свойства, създадени от класа на наследник, така че те не могат да бъдат докоснати директно от наследникът. Следният код използва отражение за принудително достъп.

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 за достъп до свойствата на наследения клас.