2012-10-30 56 views
1

使用MS Visual Studio 2012 Express,使用C#.NET 4.0。C#縮短數據表功能

嗨,大家好,我相信這是一個簡單的。

我一直在應老闆的要求衝一個程序,但現在事實證明我有更多的空閒時間。

所以我要通過代碼試圖使其更加緊湊,清洗劑等

我有這一個功能.....

public void RunMonth() 
{ 
    //** top 10 listings*********************//    
    SetTxtBox1(DateTime.Now.ToString() + " ==== END OF MONTH REPORTS starting.........\r\n"); 
    SetTxtBox1(" **************************************************************************************\r\n"); 
    try 
    { 
     VRMtableDESC = querys.TopVRM("DESC"); 
     SetTxtBox1(DateTime.Now.ToString() + " ==== VRM Top has been loaded\r\n"); 
    } 
    catch 
    { 
     SetTxtBox1(DateTime.Now.ToString() + " ==== VRM Top has FAILED\r\n"); 
    } 
} 

「VRMtableDESC」是一個DataTable,約18個數據表中的一個。對於每個數據表,這個try語句運行。

現在,你可以告訴這是目前每個表重複18次。 而不是我想循環到表中,並填寫它們的數據。

有沒有辦法做到這一點?據我所知,我需要對數據表和query.function調用進行某種集合。

到目前爲止,我打了一個空白,所以即時通訊希望有一些即時消息丟失。

由於提前

:::: UPDATE :::: 好了,所以我有這個成立至今....

foreach (DataTable tbl in MyDataSet.Tables) 
{ 
    tbl.TableName.Equals(querys.TopVRM("")); 
} 

equals方法需要在其動態方法選擇太....任何想法?

:: UPDATE(31/10/12)::

嗨再次,即時得到一個錯誤,常見的錯誤「對象不會發送到對象的實例」

它apears在合併中foreach循環。

我調試了我的查詢調用,看起來不錯。

var tables = new SortedDictionary<string, Func<DataTable>>() 
     { 
      {"VRMtableDESC", () => querys.TopVRM("DESC")}, 
      {"VRMtableASC", () => querys.BotVRM("ASC")}, 
      {"SpectableDESC",() => querys.TopSpec("DESC")}, 
      {"SpectableASC", () => querys.botSpec("ASC")}, 
      {"ParttableDESC",() => querys.TopPart("DESC")}, 
      {"ParttableASC",() => querys.BotPart("ASC")}, 
      {"MantableDESC", () => querys.TopManual("DESC")}, 
      {"MantableASC", () => querys.BotMan("ASC")}, //why is this first to run????? 
      {"UsersLockedTbl",() => querys.UserLocked()}, 
      {"NewUsersTbl", () => querys.NewUsers()}, 

      {"VRMtotaltblTOP", () => querys.VRMtotalTOP("")}, 
      {"PARTtotaltblTOP", () => querys.PARTtotalTOP("")}, 
      {"SPECtotaltblTOP", () => querys.SPECtotalTOP("")}, 
      {"MANtotaltblTOP", () => querys.MANtotalTOP("")}, 
      {"VRMtotaltblBOT", () => querys.VRMtotalBOT("")}, 
      {"PARTtotaltblBOT", () => querys.PARTtotalBOT("")}, 
      {"SPECtotaltblBOT", () => querys.SPECtotalBOT("")}, 
      {"MANtotaltblBOT", () => querys.MANtotalBOT("")}, 
     }; 

     foreach(var kvp in tables) 
     { 
      try 
      { 
       MyDataSet.Tables[kvp.Key].Merge(kvp.Value());//error occurs here 
       SetTxtBox1(String.Format("{0} ==== {1} has been Loaded\r\n", DateTime.Now.ToString(), kvp.Key)); 
      }catch(Exception e) 
      { 
       SetTxtBox1(String.Format("{0} ==== {1} has FAILED\r\n", DateTime.Now.ToString(), kvp.Key)); 
       MessageBox.Show("error:::" + e); 
      } 
     } 
     AutoRunApp(); 

任何幫助將是偉大的。

更新::

繼承人從 「bunchofquerys」 我的查詢電話類

public DataTable BotMan(string order) 
    { 

      SqlConnection conn = new SqlConnection(myConnString32); 
      SqlCommand vrm = new SqlCommand(); 
      //BindingSource bindme = new BindingSource(); 
      SqlDataAdapter adapt1 = new SqlDataAdapter(vrm); 
      // DataSet dataSet1 = new DataSet(); 
      DataTable table1 = new DataTable(); 
      try 
      { 
      vrm.Connection = conn; 
      vrm.CommandType = CommandType.StoredProcedure; 
      if (order.Equals("DESC")) 
      { 
       vrm.CommandText = "dbo.TopManual"; 
      } 
      vrm.CommandText = "dbo.BotManual"; 
      vrm.CommandTimeout = 360; 

      vrm.Parameters.AddWithValue("@OrderBy", order); 
      adapt1.Fill(table1); 
      return table1; 
     } 
     catch (Exception e) 
     { 
      MessageBox.Show("eeror::zomg::: " + e); 

     } 
     return table1; 
    } 
+0

DataTable的自然集合是DataSet。 http://msdn.microsoft.com/en-us/library/aeskbwf7.aspx –

+0

事實上,我有一個數據集,我已經將空白表添加到它。但不知道如何將查詢添加到數據集內的每個表。 – lemunk

+0

目前我有一個foreach(在myDataSet.tables中的數據表tbl),但它的代碼上下文,我需要通過該im im不知道,語法等,以及通過這個im不知道 – lemunk

回答

2

你說你已經有一個DataSet。填寫所有表格的簡單方法是使用Merge

在這個例子中,我創建的表名之間的映射(在DataSet表的名稱),以及相應的查詢功能(假設他們返回DataTable具有類似的模式,你的DataSet被命名爲ds )。

Key用於從DataSet查詢適當DataTable,然後使用Merge方法來「填充」的DataTable

var tables = new SortedDictionary<string, Func<DataTable>>() //or use List of Tuples... 
{ 
    {"VRM_TOP", () => querys.TopVRM("DESC")}, 
    {"FooBar_TOP",() => querys.FooBar("DESC")}, 
    {"Something", () => querys.Something("ASC")}, 
}; 

foreach(var kvp in tables) 
    ds.Tables[kvp.Key].Merge(kvp.Value()); 

你可以做輪用另一種方式和每個表遍歷你DataSet,並通過獲得相應的加載函數表的TableName

您的try/catch塊現在可以輕鬆地添加到foreach循環中。

foreach(var kvp in tables) 
{ 
    try 
    { 
     ds.Tables[kvp.Key].Merge(kvp.Value()); 
     SetTxtBox1(String.Format("{0} ==== {1} has ben loaded\r\n", DateTime.Now, kvp.Key)); 
    } 
    ... 
} 
+0

ive使用你的解決方案,發生錯誤發生,說一個entery相同鍵已經存在,有什麼想法? – lemunk

+0

您可能在字典中添加了兩次密鑰。 – sloth

+0

嗨,是的。然而,我確實有一個新問題,我會更新我的問題以顯示正在發生的事情。 – lemunk