2009-01-19 103 views
1

以前我問過inserting a column into a dataset。我現在有一個類似的問題,即將兩列或更多列合併爲一列。如何合併DataSet中的兩列?

可以說我有以下數據集:

DataSet ds = new DataSet(); 
ds.Tables.Add(new DataTable()); 
ds.Tables[0].Columns.Add("id", typeof(int)); 
ds.Tables[0].Columns.Add("firstname", typeof(string)); 
ds.Tables[0].Columns.Add("lastname", typeof(string)); 

我需要的「名字」和「姓氏」列組合成所謂的「名」一列。

對我來說,創建一個將兩個列合併在一起的方法還是一個可以用來將多個列合併在一起的更一般的方法是最好的方法?

我的想法是像下面創建排序的一般化方法:

MergeColumns(字符串格式,串mergedColumn,數據表DT,則params串[] columnsToMerge)

用戶如下提供的格式:「{0} {1}」

mergedColumn是新列的名稱......但它必須能夠與將要合併的列之一相同因爲在我的現實世界中, m將「name」和「given_names」合併爲「name」...但我仍然希望能夠使用它,如果我需要合併「街道」,「城市」,「州」,「後科de「等列入名爲」地址「的列。

我想這將被使用的方式如下:

MergeColumns( 「{0} {1}」, 「姓名」,的dataTable, 「姓名」, 「姓」);

給出了上述數據集,我期望得到的數據設置爲如下所示:

DataSet ds = new DataSet(); 
ds.Tables.Add(new DataTable()); 
ds.Tables[0].Columns.Add("id", typeof(int)); 
ds.Tables[0].Columns.Add("name", typeof(string)); 

這個問題似乎是一個合理的做法?像這樣的方法是否已經存在?我不想重新發明輪子。另外,我是否正在創建比我現在需要的功能更多的方法?

回答

1

在我看來,這應該發生在數據層而不是邏輯層。據推測數據集消費者知道它需要什麼數據並且可以明確地從數據存儲請求它,而不必操縱數據集。

在一個數據庫場景中,我本質上是一個多存儲過程的方法,數據集的使用者將從合適的數據集檢索數據。

+0

實際上這不是一個壞主意......我只是仔細檢查了我已經提供的規範,並且沒有任何內容說這不能在存儲過程級別完成......這種方式我只回到「名稱」列... – mezoid 2009-01-19 05:18:30

+0

我投這個答案,因爲它允許我輕鬆地在存儲的proc級別完成工作。雖然這個答案沒有回答如何實際合併兩列,但它確實表明我正在考慮解決方案。 – mezoid 2009-01-19 06:22:51

1

如果數據集足夠具體,MergeName()方法就可以。如果你不認爲你會在多個地方使用它,情況尤其如此。一個通用的方法需要更多的工作,但如果你進行了大量的合併,這可能是值得的。

有些事情我能想到把我的頭頂部,你必須處理:

你可能會碰到
  • 的一個問題是類型檢查;如果用戶想要合併日期字段或數字字段會發生什麼情況。
  • 舊領域會發生什麼?他們會留下還是被刪除?如果您將此用作直接數據源,則可能需要刪除左側的列,因此某種RemoveOldColumns標誌可能是個好主意。
+0

是的,這些都是有效的擔憂......這讓我覺得我應該儘可能以最簡單的方式做到這一點。 – mezoid 2009-01-19 05:19:25

0
 DataSet ds = new DataSet(); 
     ds.Tables.Add(new DataTable()); 
     ds.Tables[0].Columns.Add("id", typeof(int)); 
     ds.Tables[0].Columns.Add("firstname", typeof(string)); 
     ds.Tables[0].Columns.Add("lastname", typeof(string)); 


     ds.Tables[0].Rows.Add(1,"torvalds", "linus"); 
     ds.Tables[0].Rows.Add(2,"lennon", "john"); 


     ds.Tables[0].Columns.Add("name", typeof(string)); 
     foreach (DataRow dr in ds.Tables[0].Rows) dr["name"] = dr["lastname"] + ", " + dr["firstname"]; 


     foreach (DataRow dr in ds.Tables[0].Rows) 
      MessageBox.Show(dr["name"]); 
4
public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 


     DataSet ds = new DataSet(); 
     ds.Tables.Add(new DataTable()); 
     ds.Tables[0].Columns.Add("id", typeof(int)); 
     ds.Tables[0].Columns.Add("firstname", typeof(string)); 
     ds.Tables[0].Columns.Add("lastname", typeof(string)); 


     ds.Tables[0].Rows.Add(1,"torvalds", "linus"); 
     ds.Tables[0].Rows.Add(2,"lennon", "john");    


     ds.Tables[0].MergeColumns("name", "lastname", "firstname"); 

     foreach (DataRow dr in ds.Tables[0].Rows) 
      MessageBox.Show(dr["name"].ToString()); 


    } 


} 

public static class Helper 
{ 
    public static void MergeColumns(this DataTable t, string newColumn, params string[] columnsToMerge) 
    { 
     t.Columns.Add(newColumn, typeof(string)); 

     var sb = new StringBuilder(); 

     sb.Append("{0}, "); 
     for (int i = 1; i < columnsToMerge.Length; ++i) 
      sb.Append("{" + i.ToString() + "}"); 

     string format = sb.ToString(); 

     foreach(DataRow r in t.Rows) 
      r[newColumn] = string.Format(format, columnsToMerge.Select(col => r[col]).ToArray()); 
    } 


} 
1

或者,你可以這樣做:

public Form1() 
    { 
     InitializeComponent(); 


     DataSet ds = new DataSet(); 
     ds.Tables.Add(new DataTable()); 
     ds.Tables[0].Columns.Add("id", typeof(int)); 
     ds.Tables[0].Columns.Add("firstname", typeof(string)); 
     ds.Tables[0].Columns.Add("lastname", typeof(string)); 


     ds.Tables[0].Rows.Add(1,"torvalds", "linus"); 
     ds.Tables[0].Rows.Add(2,"lennon", "john");  


     ds.Tables[0].Columns.Add("name", typeof(string), "lastname + ', ' + firstname"); 


     foreach (DataRow dr in ds.Tables[0].Rows) 
      MessageBox.Show(dr["name"].ToString()); 


    } 
0

這究竟是我的要求,很多搜索的我在決定其更好地創建自己的數據表和使用結束後作爲您的ListBox或DropDownList的數據源,無論哪個是必需的。

DataTable dt = new DataTable(); 
dt.Columns.Add("Test",typeof(String)); 
foreach (DataRow r in ds.Tables[0].Rows) 
{ 
    DataRow dr = dt.NewRow(); 
    dr["Test"] = r["LastName"] + " ," + r["firstName"]; 
    dt.Rows.Add(dr); 
} 

這裏ds是包含該過程的主返回表的數據集。

0
string result = string.Join(",", dtTotalQuery.AsEnumerable().Select(row => dtTotalQuery.Rows[0].ItemArray[0] + " " + dtTotalQuery.Rows[0].ItemArray[1]));