one-to-many relationship என்பதை மொழி பெயர்த்ததால் இப்படி ஒரு சொதப்பலான தலைப்பு அமைந்து விட்டதென்றாலும், இவ்வகையில் அமைந்த தகவல்தளம் மிகவும் பயனுள்ளது என்பதில் ஒரு துளியும் சந்தேகம் இல்லை.
வேறு டேபிலில் உள்ள பல வரிசைகளுடன் தொடர்பில் இருக்கும் ஒரு தகவல் வரிசையை, டேட்டாக்ரிட் கண்ட்ரோலின் துணை கொண்டு காண்பிப்பது மிகவும் சுலபம். ஒரு எடுத்துக்காட்டிற்கு, subtext என்ற திறமூல மென்பொருள் கொண்டு இயங்கும் இந்த வலைப்பூவிற்கான தகவல் தள அமைப்பில் இருந்து இரண்டு டேபிள்களை எடுத்துக்கொள்வோம்.
Subtext_Config
Subtext_Content
| ID |
Title |
Text |
DateAdded |
BlogId |
சப்டெக்ட்ஸ்ட்டில் பல வலைப்பூக்களை வைத்துக்கொள்ளலாம், பல பயனர்க்கணக்குகளை உருவாக்கிக்கொள்ளலாம். ஒவ்வொரு வலைப்பூவுக்கும் ஒரு BlogIdயும் ஒரு பயனரும் உண்டு. இந்த விவரம் subtext_config டேபிளில் இருக்கும். வலைப்பூவின் பதிவுகளும் subtext_content டேபிளில் சேமிக்கப்படும். BlogId என்ற fieldன் துணைகொண்டு, எந்த வலைப்பூவிற்கு ஒரு குறிப்பிட்ட பதிவு சொந்தமானது என்பதை அறியலாம். இப்பொழுது நம் எடுத்துக்காட்டின் தொடர்ச்சியாக, ஒவ்வொரு வலைப்பூவிலும் உள்ள பதிவுகளின் தலைப்புக்களைக் காண்பிக்க ஒரு சிறிய formஐ c# மொழியில் உருவாக்குவோம்.
டேட்டா க்ரிட்டில் ஒரு டேட்டா டேபிளை bind செய்து தகவல் தளத்தில் உள்ள விவரங்களைப் பொதுவாகக் காண்பிப்போம். இரண்டு டேபிளில் உள்ள விவரங்கள் என்றால், inner join, outer join என்று ஏதாவது ஒன்றைப் பயன்படுத்தி, இணைத்துக் காண்பிக்கலாம். இது தவிரவும், DataRelations பயன்படுத்தியும் இரண்டு டேபிள்களை டாட்நெட்டில் இயக்க நேரத்தில் இணைத்துப் பயன்படுத்தலாம். கீழ்க்காணும் உதாரணத்தைப் பாருங்கள்:
1 SqlConnection con =
new SqlConnection("server=myserver;uid=test;pwd=test;database=subtextdata");
2 SqlDataAdapter da =
new SqlDataAdapter("select * from subtext_config;select * from subtext_content", con);
3 DataSet ds =
new DataSet();
4 da.Fill(ds);
5 da.Dispose();
6 con.Dispose();
7 ds.Relations.Add("UserPosts", ds.Tables[0].Columns["BlogId"], ds.Tables[1].Columns["BlogId"]);
8 DataGrid1.DataSource = ds.Tables[0];
9 DataGrid1.DataBind();
இரண்டு வெவ்வேறு வினவலைப் பயன்படுத்தி, டேட்டா அடாப்டர் ஒன்று உருவாக்கி இரண்டு டேபிள்களில் உள்ள டேட்டாவையும் ஒரு டேட்டாசெட்டில் சேமிக்கிறோம். இதனால், ds என்ற டேட்டாசெட்டில், subtext_config என்ற டேபிளும், subtext_content என்ற டேபிளும் சேமிக்கப்பட்டுள்ளன. இவற்றை முறையே ds.Tables[0] என்றும் ds.Tables[1] என்றும் சுட்டலாம். பிறகு Relations.Add ஃபங்க்ஷனைப் பயன்படுத்தி, BlogId என்ற இரண்டு டேபிளுக்கும் பொதுவான fieldஐக் குறிப்பிட்டு UserPosts என்ற உறவினை உருவாக்குகிறோம். இனிமேல், முதல் வலைப்பூவின் பதிவுகளை எல்லாம் எடுக்க வேண்டும் என்றால், ds.Tables[0].Rows[0].GetChildRows("UserPosts") என்று குறிப்பிட்டால் போதும். Rows[0]விற்கான அத்தனை குழந்தை வரிசைகளும் ஒரு டேட்டா ரோ அர்ரேவாக வந்துவிடும். அதாவது முதல் வரிசையில் இருக்கும் முதல் வலைப்பூவுக்கான பதிவுகள் அனைத்தும் கிடைக்கும். இதுதான் டேட்டாசெட்டில் உள்ள இரண்டாவது டேபிளில் சேமிக்கப்பட்டு இருக்கிறது.
பிறகு DataGrid1 என்ற ஒரு டேட்டாக்ரிட்டுக்குரிய டேட்டா சோர்சுக்கு முதல் டேபிளான subtext_configஐ சுட்டுகிறோம், நிரல் வரி 8இல் இருக்கும் DataGrid1.DataSource = ds.Tables[0] என்று.
இப்பொழுது frontend html வரிகளைப் பார்ப்போம்:
<
asp:DataGrid id="
DataGrid1"
runat="
server"
AutoGenerateColumns="
False">
<
Columns>
<
asp:BoundColumn DataField="
UserName"
HeaderText="
Blog User"></
asp:BoundColumn>
<
asp:TemplateColumn HeaderText="
User Posts">
<
ItemTemplate>
<
ol>
<
asp:Repeater id="
Repeater1"
runat="
server"
DataSource = '
<%# ((System.Data.DataRowView)Container.DataItem).Row.GetChildRows("UserPosts")
%>'>
<
ItemTemplate>
<
li />
<%# DataBinder.Eval(Container.DataItem, "[Title]")
%>
</
ItemTemplate>
</
asp:Repeater>
</
ol>
</
ItemTemplate>
</
asp:TemplateColumn>
</
Columns>
</
asp:DataGrid>
இந்த டேட்டாக்ரிட்டில் இரண்டு காலம்கள் இருக்கின்றன, ஒன்று வலைப்பூவை நடத்துபவரின் பெயர்களைக் காண்பிக்க, இன்னொன்று ஒவ்வொரு வலைப்பூக்காரரின் பதிவுகளையும் காண்பிக்க.
இந்த இரண்டாவது காலத்தில்(column)தான் ஒரு ரிப்பீட்டர் கண்ட்ரோல் இருக்கிறது. ஒவ்வொரு தாய்வரிசைக்கான குழந்தைப் வரிசைகளையும் இதுதான் காண்பிக்கப்போகிறது. BlogIdதான் இந்த தாய்/குழந்தை உறவை நிர்ணயிக்கும் என்பதை ஏற்கனவே நாம் நிரலில் (8ஆம் வரி) குறிப்பிட்டு விட்டோம். எனவே, இப்பொழுது நாம் பண்ண வேண்டியது எல்லாம் ரிப்பீட்டரின் டேட்டா சோர்சுக்கு அந்தந்த வலைப்பூக்களின் குழந்தை வரிசைகளை அனுப்பி வைக்க வேண்டியது மட்டும்தான். ds.Tables[0].Rows[0].GetChildRows("UserPosts") என்பதை, இயக்க நேரத்தில் டேட்டாக்ரிட்டுக்குள் ((System.Data.DataRowView) Container.DataItem).Row.GetChildRows("UserPosts") என்று குறிப்பிடலாம். இதற்கு databinding command என்று பெயர்.
Four Guys From Rollaவில் இது பற்றி சற்று விரிவாக இருக்கிறது.
இப்படி ரிப்பீட்டர் கண்ட்ரோலுக்கு டேட்டா சோர்ஸ் செட் பண்ண மறந்து போய் விட்டால், itemtemplateஇல் குறிப்பிடப்பட்டிருக்கும் Title காலம் தாய்டேபிளான subtext_configகு உரியதாகக் கருதப்படும். வேறு ஏதாவது column ரிப்பீட்டர் கண்ட்ரோலின் itemtemplateஇல் இருந்து தாய் டேபிளில் இல்லாமல் போனால், Column Not Found பிழைச்செய்தி வரும். இதில் சுவையான விஷயம் என்னவென்றால், இவை அனைத்தையும் டேட்டாக்ரிட்டின் ItemDataBound ஈவண்ட்டிற்குப் போய் ரிப்பீட்டரைக் கண்டு பிடித்து, cast செய்து, டேட்டா செட்டை global variableஆக டிக்ளர் செய்து என்றெல்லாம் மாங்கு மாங்கு என்று நிரல் வரிகள் எழுதாமல் சுலபமாக ரிப்பீட்டர் கண்ட்ரோலின் டேட்டாசோர்சின் உதவியுடன் ஒரே வரியில் முடிக்க முடிந்ததுதான்.