Изменение базового класса ТаблицыAdapter в набранном DataSet
Код для создания и генерации набранного DataSet
Набранный DataSet позволяет создать DataTable, который имеет информацию о типе для каждого столбца на основе S'L, или TableAdapter, который упрощает взаимодействие данных с DB на основе набранного DataTable.
Поскольку цель состоит не в том, чтобы создать набранный DataSet здесь, давайте быстро создадим DataSet с базой данных и таблицей, готовой к настоящему времени. Вы также можете делать все, что вы хотите, чтобы выложить таблицу.
Первым шагом является добавление DataSet в качестве нового элемента в проект. Название ничего, но это осталось здесь.
Откройте DataSet и добавьте настольный адаптер от дизайнера.
Следуйте за мастером, чтобы создать 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.金額));
}
}
}
Как правило, проект, который использует этот DataSet, имеет менее одной таблицы, и вы создаете много наборов данных, которые объединяют количество таблиц или нескольких таблиц. Я думаю, что это общая изация обработки, чтобы придумать, когда это произойдет. Например, можно динамически изменить си-Л, используемый внутри компании, чтобы изменить условия для извлечения записей.
Однако класс TableAdapter, созданный из DataSet, автоматически генерируется кодом. Кроме того, поскольку этот класс 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, чтобы увидеть, что у вас есть доступ к расширенным свойствам.
Однако доступ к внутренним свойствам не означает, что этот процесс является общим, и все равно необходимо написать код для каждого создаваемого DataSet.
Изменение базового класса ТаблицыAdapter
Как упоминалось ранее, класс TableAdapter наследует класс Компонента, что затрудняет совместное совместное обсуждение. Если вы измените часть кода, которая наследует класс, код автоматически генерируется, поэтому обновление DataSet снова возвращает код. Если вы можете, вы можете написать частичный класс, который наследует интерфейс в отдельном файле, но это не имеет большого смысла, потому что вы должны написать столько TableAdapters, как вы создали.
В самом деле, есть механизм для изменения наследуемого класса этого TableAdapter. Я хотел бы объяснить процедуру.
Во-первых, создайте класс, который вы хотите унаследовать. TableAdapter изначально унаследовал класс Компонента, поэтому вы должны унаследовать класс Компонента, даже если вы его создадите. Я напишу код, которым хочу поделиться здесь, но я просто напишу класс. Сопойте пространство имен с созданным.
using System.ComponentModel;
namespace DataSetBaseAdapter
{
public class BaseAdapter : Component
{
}
}
Затем откройте дизайнер DataSet и выберите созданный вами tableAdapter.
Нажмите правой кнопкой мыши, чтобы открыть свойство. Существует свойство под названием BaseClass, которое изначально должно быть "System.ComponentModel.Component". Перепишите это на только что созданный класс. Я напишу все, включая пространство имен.
При сохранении, вы увидите, что базовый класс TableAdapter изменился. Установив это для каждого TableAdapter, вы можете написать общую обработку для базового класса.
Например, если вы хотите получить доступ к внутреннему S-L или S'LDataAdapter, напишите: Адаптеры и Командные Коллекции, которые создаются автоматически, являются только свойствами, созданными классом наследника, поэтому они не могут быть затронуты непосредственно от наследника. Следующий код использует отражение, чтобы заставить доступ.
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 для доступа к свойствам унаследованного класса.