2009-12-24 30 views
0

問候編程方式調用一個方法TableAdapters.Fill師的C#:使用字符串指定的TableAdapter

我有TableAdapter的和補法特有的問題。 作爲將應用程序綁定到DataSource的結果,我有一堆自動生成的TableAdapter。 他們必須按照預期控制我的表格和工作。

現在我需要調用從時間TableAdapter的填充方法,時間 ,我想這樣做編程(TableAdapter的[「名稱」]填寫(myDataSet [「Name_Table」]);) ,而不是從字面上(TableAdapter_Name.Fill(myDataSet.Name_Table);

的想法是一個字符串傳遞給可通過解析串以識別所期望的對象調用目標的TableAdapter的方法 我常常希望的是C#支持創建動態語句/方法(從字符串),可以像正常語句那樣執行。

這是可能的嗎?(如果不是這樣就像我會做很多字面輸入來代表我所有的TableAdapter,並且當我在代碼中進行大量的字符串字面輸入,這是一個紅色的標誌,我做錯了什麼「

Help,Zion

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

回答

0

您可以創建一個字典< DataTable,TableAdapterWrapper >將您的數據表與您的表適配器相關聯。包裝類可以使用反射來調用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#語法腳本免費圖書館。採用這個庫,你可以的編寫一個獲取字符串並將其作爲語句運行的方法。 這是我用來創建動態語句的解決方案。

+0

這是COOL!我不知道這存在,我已經好幾年了AutoIt的和VBScript的傢伙,希望更多的權力! (PowerShell笨重緩慢,F#未成熟)這就是我一直在尋找的東西。感謝您的提示。車輪正在轉彎。哇! – Zion 2009-12-24 20:09:39

+0

它是真正強大和易於使用,很高興你的問題得到解決。 順便說一句,如果你喜歡它或將它解決你的問題,你可以糟蹋它作爲你的答案或投票給它.thanks – Asha 2009-12-25 16:02:11

+0

我還沒有一個機會向執行尚未提供的解決方案。 CS腳本不會因爲它是一個可部署的應用程序。 – Zion 2009-12-25 16:35:13

0

本質上你所要求的類似的JavaScript eval(...)聲明。不,C#沒有這個,並且有很好的理由。除此之外,它必須在運行時爲每個實例啓動一個新的編譯器。可能有一些庫或外部工具提供這種類型的功能,但我會非常謹慎使用它們這樣的事情的。

如果這些TableAdapter的是一種形式,那麼他們是實例成員,你可以使用Type.GetField方法來找到適配器,然後Type.GetMethod找到在TableAdapter上的Fill方法來調用。

但我的問題是,爲什麼你需要做到這一點?對我而言,紅旗是有人試圖在數據層上創建如此混亂的抽象的事實。需要考慮的事項:

  • 大多數數據庫都有很少的表,它們足夠小,可以轉儲所有行而不會同時殺死數據庫和應用程序性能。您幾乎不應該使用無參數Fill/GetData方法。
  • 使用反射意味着你沒有得到任何編譯時檢查,除非它是非常嚴格的控制(即一些DI框架的一部分),它可能導致神祕的,難以調試的錯誤的道路。
  • Fill方法本身需要一個類型參數,因此,如果您嘗試寫一個「通用」補法,它使得人寫代碼,傳遞一個不正確的表型,這可能導致各種有趣的和不可預知的問題。
  • TableAdapter的一般是 - 怎麼說呢這一點 - 不完全過時,但不是數據訪問的首選手段的今天。實體框架和Linq to SQL是更有吸引力的選擇。除非你從前任設計師那裏繼承了這個DAL,爲什麼要使用它呢?

我想你應該解釋一下你的問題域。我敢打賭,有一個更好的設計可用於您的特定要求。

+0

我感謝您的反饋bro。謝謝 – Zion 2009-12-25 16:36:36