2009-12-24 2 views
0

Привет гуруC#: Programatically вызова метода TableAdapters.Fill используя строку Укажите TableAdapter

У меня есть своеобразная проблема с TableAdapters и методом заливки. У меня есть куча автогенерированных TableAdapters в результате привязки приложения к DataSource. Они обязаны контролировать мою форму и работать, как ожидалось.

Теперь мне нужно вызвать метод заливки на TableAdapters время от времени , и я хочу сделать это программно (адаптеры таблиц [ «Name»] Fill (myDataSet [ «Name_Table»]);.) вместо буквально (TableAdapter_Name.Fill (myDataSet.Name_Table).

Идея заключается в том, чтобы передать строку в метод, который можно назвать целевой TableAdapter путем разбора строки, чтобы распознать нужный объект я часто хотел, что C# поддерживается создание динамические операторы/методы (из строк), которые могут быть выполнены как обычный оператор.

Возможно ли это? (Если это не так, например, я буду делать многословную типизацию для представления всех моих табличных адаптеров, и когда я делаю много буквального ввода строк в моем коде, это КРАСНЫЙ ФЛАГ, что я делаю что-то не так »

Справка, Сион

NameTableAdapter.Fill (myDataSet.Name); StateTableAdapter.Fill (myDataSet.State); CityTableAdapter.Fill (myDataSet.City);

ответ

0

Вы можете создать словарь < DataTable, TableAdapterWrapper >, который связывает ваши данные с их адаптерами таблицы. Класс wrapper может использовать отражение для вызова метода Fill (поскольку, если я не ошибаюсь, адаптеры таблицы не реализуют общий интерфейс или не наследуют от общего базового класса).

public class TableAdapterWrapper 
{ 
    object tableAdapter; 
    DataTable table; 

    public TableAdapterWrapper(object tableAdapter, DataTable table) 
    { 
     this.tableAdapter = tableAdapter; 
     this.table = table; 
    } 

    public void Fill() 
    { 
     var methodInfo = tableAdapter.GetType().GetMethod("Fill"); 
     methodInfo.Invoke(tableAdapter, new object[] { table }); 
    } 
} 
0

Вместо того чтобы использовать имена, которые вы можете использовать перечисления в индексный массив адаптеров, как следующий

enum Types 
{ 
Adapter1,Adapter2 
} 
SqlDataAdapter [] Adapters = new SqlDataAdapter(); 
adapters[Types.Adpter1] = adapter1; 
adapters[Types.Adpter1] = adapter2; 

//call 
Adapters[Types.Adpter1].Fill(table); 
0

посмотри @CS-Script это свободная библиотека для сценариев с C# синтаксиса .using этой библиотеки вы можете напишите метод, который получит строку и запустит ее как инструкцию. Это решение, которое я использую для создания динамических операторов.

+0

Это COOL !, Я не знал, что это существовало, я был автоитом и человеком VBSCRIPT годами и хотел больше PowER! (PowerShell неуклюже медленный, F # является inmature) Это то, что я искал. Спасибо за этот совет. Теперь колесо поворачивается. Вау! – Zion

+0

действительно мощный и простой в использовании, счастливый, что ваша проблема решена. BTW, если вам понравилась эта проблема, вы можете пометить ее как свой ответ или проголосовать за нее .thanks – Asha

+0

У меня не было возможности реализовать предлагаемые решения. CS-Script не будет означать, что это приложение для развертывания. – Zion

0

По существу, вы просите что-то вроде инструкции javascript eval(...). Нет, у C# этого нет, и не зря. Помимо всего прочего, он должен будет запустить новый компилятор для каждого экземпляра этого во время выполнения. Там могут быть некоторые библиотеки или внешние инструменты, которые обеспечивают этот тип функциональности, но я бы очень опасался использовать их для чего-то подобного.

Если эти адаптеры таблицы находятся в форме, то они являются членами экземпляра и вы могли бы использовать метод Type.GetField, чтобы найти адаптер и затем Type.GetMethod найти Fill метод на TableAdapter для вызова.

Но мой вопрос: Почему вам это нужно? Для меня красный флаг - это тот факт, что кто-то пытается создать такую ​​грязную абстракцию над слоем данных.Что следует учитывать:

  • Большинство баз данных имеют очень мало таблиц, которые достаточно малы, чтобы сбрасывать все строки из-за отсутствия как производительности базы данных, так и производительности приложения. Вы почти никогда не должны использовать методы без параметров Fill/GetData.
  • Использование Reflection означает, что вы не проводите проверку времени компиляции, и если она не будет очень жестко контролироваться (т. Е. Как часть некоторой рамки DI), это может привести к таинственным, трудно отлаживающим ошибкам в будущем.
  • Сам метод Fill принимает типизированный параметр, поэтому, если вы попытаетесь написать «общий» метод заполнения, он позволяет кому-то писать код, который передает неправильный тип таблицы, что может привести к разным развлечениям и непредсказуемые проблемы.
  • TableAdapters в целом - как я должен сказать это - не совсем устарел, но не является предпочтительным средством доступа к данным сегодня. Entity Framework и Linq to SQL - гораздо более привлекательные варианты. Если вы не унаследовали этот DAL от предыдущего дизайнера, зачем использовать его вообще?

Я думаю, вам стоит больше рассказать о своей проблемной области. Я готов поспорить, что для ваших конкретных требований есть лучший дизайн.

+0

Я ценю вашу обратную связь. благодаря – Zion

Смежные вопросы