our notes for our youngers

October 31, 2009

Graphics And Random

Filed under: Window Form Application — Tags: , , , , — sevenlamp @ 2:32 PM

Graphics Class

ကြၽန္ေတာ္တို႔ ပံုေတြဆြဲခ်င္ျပီဆိုရင္ ဘာေတြလိုအပ္မလဲ။ အရင္ဆံုး ဆြဲဖို႔အတြက္ ေနာက္ခံတစ္ခုလိုပါမယ္။ စာရြက္ေသာ္လည္းေကာင္း၊ နံရံေသာ္လည္းေကာင္း၊ ပိတ္ကား ေသာ္လည္းေကာင္းေပါ့။ ေနာက္ျပီး ဆြဲမယ့္ ခဲတံျဖစ္ျဖစ္ စုတ္တံျဖစ္ျဖစ္လိုပါမယ္။ ဒီ ၂ ခုရွိျပီဆိုရင္ေတာ့ ကြၽန္ေတာ္တို႔ ပံုေတြ ဆြဲလို႔ရပါၿပီ။ ဒီအတုိင္းပါပဲ ကြၽန္ေတာ္တို႔ C# window application မွာ graphic ပံုေတြ ဆြဲဖို႔ လိုအပ္လာျပီဆိုရင္လည္း ဆြဲခ်င္တဲ႔ ေနာက္ခံ object နဲ႔ ဆြဲမယ့္ pen or brush လိုအပ္ပါတယ္။ တကယ္ဆြဲတဲ႔ အလုပ္ကိုေတာ့ graphics object ကေနတဆင့္လုပ္ေပးရပါမယ္။ အရင္ဆံုး Graphics Class ကို object ေဆာက္ရပါမယ့္။ ဒီလို ေဆာက္တဲ႔အခါ ကြၽန္ေတာ္တို႔ ဆြဲခ်င္တဲ႔ ေနာက္ခံobject ကေနတဆင့္ CreateGraphic() ဆိုတဲ႔ function ကိုသံုးၿပီးေဆာက္ရမွာပါ။ ဒီလိုမ်ိဳးပါ..

Graphics g = this.CreateGraphics();          // form ေပၚမွာ ဆြဲရန္…

Graphics g = label1.CreateGraphics();       // label ေပၚမွာ ဆြဲရန္…

ေနာက္ခံကိုေရြးၿပီးၿပီဆိုရင္ အခုလိုအပ္တာက ဆြဲမယ့္ ခဲတံပါ။ ကြၽန္ေတာ္ဆြဲမယ့္ပံုမွာ outline အနားသပ္ပဲ ပါမယ္ဆိုရင္ Pen class ကိုသံုးရၿပီး။ အတြင္းသား ကိုပါ အေရာင္ျဖည့္မယ္ဆိုရင္ေတာ့ Brush class ကိုသံုးရပါမယ္။ ကြၽန္ေတာ္လိုခ်င္တဲ႔ အေရာင္ကိုလည္း တခါတည္း ေျပာေပးလိုက္ပါမယ္။

Pen p = new Pen (Color.Red);                 // အနီေရာင္ ခဲတံေလး တစ္ခုယူလိုက္တာပါ။

လိုင္းရဲ႕ အထူအပါးကိုပါ ခ်ိန္ေပးလို႔လည္း ရပါတယ္။ pen class မွာ width property မွာ ျပင္ေပးလို႔ရပါတယ္။

p.Width = 2;            // line အထူ 2 pixel ယူပါမယ္။

ဒါမွမဟုတ္… Pen object ေဆာက္တုန္းမွာပဲ constructor ထဲမွာတခါတည္း ထည့္ေပးလိုက္လည္း ရပါတယ္။

Pen p = new Pen (Color.Red, 2);

Brush object ေဆာက္ရင္ေတာ့ တစ္ခ်က္သတိထားရမွာက Brush class ကိုယ္တိုင္ကို object ေဆာက္လို႔ မရပါဘူး။ သူ႔ရဲ႕ child class (SolidBrush, LinearGradientBrush,…) ေတြကိုပဲ object ေဆာက္လို႔ရပါတယ္။

Brush b = new SolidBrush (Color.Green);   // အစိမ္းေရာင္ စုတ္တံေလးတစ္ခုယူလိုက္တာပါ။

ကဲ.. အခုေနာက္ဆံုး ကြၽန္ေတာ္တို႔ တကယ္ဆြဲပါေတာ့မယ္။ Pen ကိုသံုးမယ္ဆိုရင္ Draw function ေတြကိုသံုးရျပီး၊ Brush ကိုသံုးမယ္ဆိုရင္ေတာ့ Fill Function ကို သံုးရပါတယ္။ အခုကြၽန္ေတာ္ width 100, height 100 ရွိတဲ႔ အစိမ္းေရာက္ box ေလးကို အနီေရာင္အနားကြပ္ေလးနဲ႔ လိုခ်င္တယ္ဆိုရင္…..

Graphics g = this.CreateGraphics();

Pen p = new Pen(Color.Red, 2);

Brush b = new SolidBrush(Color.Green);

g.FillRectangle(b, 10, 10, 100, 100);

g.DrawRectangle(p, 10, 10, 100, 100);

ေနာက္သိဖို႔ တစ္ခုလိုေသးတာက ဒီကုဒ္ေတြေရးရမယ့္ event ပါ။ Form စေပၚလာလာခ်င္းမွာ ေပၚခ်င္ရင္ Form_Paint event မွာ ေရးရပါမယ္။ Button တစ္ခုခုကိုႏွိပ္မွ ဆြဲမယ္ဆိုရင္ေတာ့ အဲ့ဒီ button_click event မွာ ေရးရမွာေပါ့။ Paint event မွာ မေရးထားတာေတြ အားလံုးက form ကို Minimax လုပ္လိုက္ရင္ အကုန္ ေပ်ာက္သြားမွာပါ။

Random Class

ကြၽန္ေတာ္တို႔ C# programming language မွာ random ေခါက္ခ်င္ၿပီဆိုရင္ Random Class ကိုသံုးရပါတယ္။ Random ေခါက္တယ္ဆိုတာက သက္မွတ္ထားတဲ႔ range တစ္ခုအတြင္းမွာ ျဖစ္ခ်င္တာျဖစ္ဆိုျပီး တစ္ခုကို ေရြးလိုက္တာပါ။

Random rnd = new Random();

rnd.Next();              // Integer value တစ္ခု return ျပန္ပါတယ္။

rnd.Next(10);           // 0 – 9 ထဲက value တစ္ခု return ျပန္ပါတယ္။

rnd.Next(2, 6);         // 2 – 5 ထဲက value တစ္ခု return ျပန္ပါတယ္။

ကဲ ဟုတ္ၿပီ အခုကြၽန္ေတာ္က ခုန rectangle ေလးရဲ႕ location ေလးကိုကို form ေပၚမွာ random ေပၚေအာင္ ေရးၾကည့္ရေအာင္။

Random rnd = new Random();

int x = rnd.Next(this.ClientSize.Width);

int y = rnd.Next(this.ClientSize.Height);

Graphics g = this.CreateGraphics();

Pen p = new Pen(Color.Red, 2);

Brush b = new SolidBrush(Color.Green);

g.FillRectangle(b, x, y, 100, 100);

g.DrawRectangle(p, x, y, 100, 100);

October 29, 2009

screensaver အတုေလး ေရးရေအာင္

ကြၽန္ေတာ္တစ္ခု စဥ္းစားမိတာ ရွိတယ္။ ကြၽန္ေတာ္တို႔ အတူတူ C# program ေလးေတြ ေရးၾကရေအာင္။ အရင္ဆံုး ကြၽန္ေတာ္က ေရးျပီးသား exe file ေလး တင္ေပးမယ္။ ညီတို႔က အဲ့ဒီ exe file ေလးကို run ၾကည့္ျပီး။ အဲ့ဒီ result အတိုင္းထြက္ေအာင္ ၾကိဳးစားျပီး program ေရးၾကည့္ၾကပါ။ တစ္ပါတ္ၾကာရင္ ကြၽန္ေတာ္က အဲ့ဒီ program ကို ျပန္ရွင္းျပျပီး source code တင္ေပးပါ့မယ္။ ၾကားထဲမွာ ညီတို႔ ေရးတဲ႔ program ကို ကြၽန္ေတာ္ email ကို ပို႔ေပးရင္လည္း ကြၽန္ေတာ္ စစ္ေပးပါမယ့္။ ဒီလို လုပ္ျခင္း အားျဖင့္ ကိုယ္တိုင္ ေလ့လာတဲ႔ အေလ့အက်င့္ေလးလည္း ရသြားမယ္။ program လည္း ေရး က်င့္ရသြားမယ္ေပါ့။
ကဲ အရင္ဆံုး C# window application နဲ႔ ေရးထားတဲ႔ Screen server ပံုစံ program ေလး နဲ႔ စေရးလိုက္ရေအာင္။
exe file ေလးကို ဒီကေန ယူျပီး run ၾကည့္ပါ။
http://www.sendspace.com/file/xy2ql1

note:

ဒီ program ေလးေရးဖို႔အတြက္

1 – Graphics class အေၾကာင္း

2 – Random class အေၾကာင္း

3 – Array အေၾကာင္း

4 – Timer Control အေၾကာင္းကို သိဖို႔လိုပါတယ္။

တကယ္ လိုက္ျပီး ေရးၾကလိမ့္မယ္လို႔ ေမွ်ာ္လင့္ပါတယ္….

October 23, 2009

Question & Answer 1

Filed under: ADO in Window Application, Question&Answer — Tags: , , , , , — sevenlamp @ 4:06 PM

ကြၽန္ေတာ္ သူငယ္ခ်င္းတို႔ရဲ႕ comment ထဲမွာ ေမးတဲ႔ ေမးခြန္းေလးေတြကို အလွ်င္းသင့္သလို ျပန္ေျဖနိုင္ေအာင္ဆိုျပီး Question and Answer ဆိုတဲ႔ အပို္င္းေလး ထည့္ဖို႔ စဥ္းစားမိတယ္။ ဒါနဲ႔ ဒီ category ေလးကို စလိုက္ပါတယ္။ သူငယ္ခ်င္းတို႔ C# နဲ႔ ပတ္သက္ျပီး သိခ်င္တာေလးေတြ ေမးနိုင္ပါတယ္။ ကြၽန္ေတာ္ သိသေလာက္ ေျဖေပးပါ့မယ္။ အဲ မသိရင္လည္း ၾကိဳးစား ရွာဖတ္ျပီး ေျဖေပးနိုင္ေအာင္ ၾကိဳးစားပါ့မယ္။

အရင္ဆံုး Ko Thet ေမးတဲ႔ ေမးခြန္းေလးနဲ႔ စလိုက္ရေအာင္….

Q : How to populate data in text box by using combo box.Says, Chose ID in Combo Box, then Name, Add, City, Contact no and etc will be shown in respective text box control. If you have time, please show me.

Comment by Ko Thet — October 22, 2009

A : ဒီေမးခြန္းေလးအတြက္ ကြၽန္ေတာ္ example program ေလး တစ္ခု ေရးျပပါမယ္။ အရင္ဆံုး ေအာက္မွာ ျပထားတဲ႔ ပံု(၁) အတိုင္း database ထဲမွာ table ေလး တစ္ခုေဆာက္လိုက္ပါတယ္။

Database name => Course_DB

Table name => EmployeeTable

pic_1

pic_1

Note: EmployeeID ကို ကြၽန္ေတာ္တို႔ ထည့္စရာ မလိုပဲ database မွာ auto တိုးသြားခ်င္လို႔ အဲ့ဒီ column properties မွာ (Is Identity) ကို Yes လို႔ ေပးလိုက္ပါတယ္။ Identity Seed (1) ကေနစျပီး Identity Increment (1) စီ တိုးသြားမယ္လို႔ ေျပာတာပါ။

ျပီးရင္ အဲ့ဒီ EmployeeTable ထဲကို Sample Data နည္းနည္း ျဖည့္ေပးထားလိုက္ပါမယ္။ ပံု(၂) နဲ႔ ပံု(၃)မွာ ၾကည့္ပါ။

pic_2

pic_2

pic_3

pic_3

database ေဆာက္ျပီးေတာ့ အခုကြၽန္ေတာ္တို႔ program ဘက္အပိုင္းကို ဆက္ပါမယ္။ New Window Application တစ္ခုယူျပီး ပံု(၄) အတိုင္း design ခ်လိုက္ပါတယ္။

pic_4

pic_4

Database ထဲက data ကို window form မွာ ခ်ိတ္ျပဖို႔အတြက္ ကြၽန္ေတာ္ အခု ပံု(၅) မွာျပထားသလို အဆင့္ဆင့္ လုပ္သြားလိုက္ပါ။

pic_5

pic_5

pic_6

pic_6

Data Source Configuration Wizard မွာ ‘DataBase’ ကိုေရြးျပီး Next ထပ္ႏွိပ္လိုက္ပါ။ ဒါဆိုရင္ ပံု(၇) မွာ ျပထားသလို database connection ေရြးခိုင္းတဲ႔ ေနရာကိုေရာက္ပါမယ္။ ကြၽန္ေတာ္တို႔က အခုမွ connection အသစ္ေဆာက္မွာ ျဖစ္လို႔ New Connection button ကိုႏွိပ္လိုက္ပါ။ Add connection wizard ေရာက္ရင္ ပံု(ဂ) မွာ ျပထားသလိုမ်ိဳး connection တစ္ခု ေဆာက္လိုက္ပါ။

pic_7

pic_7

pic_8

pic_8

pic_9

pic_9

ပံု(၉) မွာ ျပထားတဲ႔ အတိုင္း ကြၽန္ေတာ္တို႔ database connection တစ္ခုရပါျပီ။ အဲ့ဒီ connection string ထဲမွာ password ထည့္သိမ္းထားမယ္ဆိုရင္ ဒုတိယ radio button ေလးကို ေရြးေပးရပါမယ္။

pic_10

pic_10

ေနာက္တစ္ဆင့္မွာ connection setting ေလးကို သိမ္းမလားလို႔ ေမးပါတယ္။ အိုေက သိမ္းထားလိုက္ပါ… နာမည္ကိုလည္း မေျပာင္းတာေကာင္းပါတယ္။

pic_11

pic_11

အခုကြၽန္ေတာ္တို႔ combobox ကေနတဆင့္ dataset ေဆာက္တဲ႔ အဆင္ျပီးသြားပါျပီ။ အခု ေျပာသလိုမေဆာက္ခ်င္ဘူး ဒါမွမဟုတ္လည္း ကြၽန္ေတာ္တို႔ form ထဲမွာ combobox မပါဘူးဆိုရင္လည္း dataset ၾကီးပဲ ဒီတိုင္း ယူျပီး ေဆာက္လို႔လည္း ရပါတယ္။ (Project Menu -> Add New Items -> DataSet )

pic_12

pic_12

Code file ထဲမွာလည္း Form_Load event ကို auto ေဆာက္ေပးသြားပါလိမ့္မယ္။

private void Form1_Load(object sender, EventArgs e)
{
      this.employeeTableTableAdapter.Fill(this.course_DBDataSet.EmployeeTable);
}

Database ထဲက data ေတြကို ကြၽန္ေတာ္တို႔ program ရဲ႕ memory ေပၚမွာ ယူျပီး သိမ္းေပးထားတဲ႔ အလုပ္ကို DataSet က လုပ္ေပးပါတယ္။ အဲ့ဒီ dataset ထဲကို data ေတြ ပို႔ေဆာင္ေပးတဲ႔ အလုပ္ကိုေတာ့ tableadapter က တာ၀န္ယူပါတယ္။ Form Load event ထဲမွာ ေရးေပးသြားတဲ႔ အလုပ္က အဲ့ဒီ data fill လုပ္ေပးတဲ႔ အလုပ္ပါ။ DataSet ထဲက data ေတြကို UI Controls ေတြမွာ ျပဖို႔ အတြက္ကိုေတာ့ BindingSource ကိုသံုးရပါတယ္။

pic_13

pic_13

အခု program ေလးကို အခုေန run လိုက္ရင္ combobox ထဲမွာ employee no ေတြကိုေတြ႔ေနရမွာပါ။ ဒါေပမယ့္ textbox ေတြမွာေတာ့ ေပၚမွာ မဟုတ္ေသးပါဘူး။ ကြၽန္ေတာ္တို႔ textbox ေတြနဲ႔ မခ်ိတ္ေပးရေသးဘူးေလ။ အိုေက အခု textbox ေတြနဲ႔ bindingsource နဲ႔ ခ်ိတ္ေပးပါ့မယ္။

pic_14

pic_14

Textbox နဲ႔ databind ဖို႔အတြက္ textbox ရဲ႕ properties window ကိုသြားလိုက္ပါ။ အေပၚဆံုးနားမွာ (DataBindings) ဆိုတဲ႔ property ေလးကို ဖြင့္လိုက္ျပီး၊ Text property ကိုႏွိပ္လိုက္ပါ။ အဲ့ဒီမွာ ကြၽန္ေတာ္တို႔ form မွာ ရွိေနတဲ႔ employeeTableBindingSource ကိုေတြရပါမယ္။ အဲ့ဒီ bindingsource ထဲကေန ကြၽန္ေတာ္တို႔ textbox မွာ ျပခ်င္တဲ႔ column name ကိုေရြးေပးလိုက္ရံုပါပဲ။ ကဲ… က်န္တဲ႔ textbox ေတြအားလံုးမွာလည္း ဒီတိုင္းပဲ လိုက္လုပ္လိုက္ပါ။ အခုဆိုရင္ေတာ့ Ko Thet လိုခ်င္တဲ႔ Program ပံုစံေလး ရျပီထင္ပါတယ္။

October 21, 2009

Database Replication (part 1)

Filed under: Database Replication — Tags: , , — sevenlamp @ 4:39 PM

Database Replication (Synchronization)

ဒီေန႔ ကြၽန္ေတာ္တို႔ database synchronization နဲ႔ ပတ္သက္တဲ႔ အေၾကာင္းေလး နည္းနည္း ေျပာၾကရေအာင္ဗ်ာ။ database ကို synchronize လုပ္တယ္ဆိုတာဘာလဲ? တစ္ခုထက္ပိုတဲ႔ database ေတြထဲမွာ data ေတြကိုအတူတူရွိေနေအာင္ ျပဳလုပ္ျခင္းလို႔ ေျပာရမယ္ထင္တယ္။ ဒီလိုဗ်ာ.. ကြၽန္ေတာ္မွာ database 2 ခုရွိတယ္ db_A နဲ႔ db_B ဆိုပါေတာ့။ အဲ့ဒီ database ၂ ခုကို synchronization လုပ္ခ်င္တယ္။ db_A ထဲကို ထည့္လိုက္တဲ႔ data ေတြကို db_B ထဲမွာပါ ေရာက္သြားေစခ်င္တာေပါ့။ ဒီလို လုပ္ထားျခင္း အားျဖင့္ အေၾကာင္း တစ္ခုခုေၾကာင့္ database တစ္ခုပ်က္သြားခဲ႔ရင္ တျခား တစ္ခုကေန data ေတြကို ျပန္ရေစနိုင္မယ္ေလ။ ေနာက္ တျခား အသံုး၀င္တဲ႔ ေနရာေတြ အမ်ားၾကီး ရွိဦးမယ္ဗ်။

Database replication မွာ publisher, distributor နဲ႔ subscriber ဆိုျပီး အဓိက ဇာတ္လိုက္ ၃ ေယာက္ရွိတယ္ဗ်။

pic_1
pic_1

Publisher ဆိုတာက replication မွာ dataေတြ ပို႔လႊတ္မယ့္ database ပါ။

Subscriber ဆိုတာကေတာ့ publisherက ပို႔လိုက္တဲ႔ data ေတြကို လက္ခံမယ့္ database ပါ။

Distributor ဆိုတာကေတာ့ data ေတြကို သယ္ယူပို႔ေဆာင္ေပးတဲ႔သူလို႔ ေျပာရမယ္ထင္တယ္။ replication နဲ႔ သက္ဆိုင္တဲ႔ replication status data ေတြကို သိမ္းထားေပးတဲ႔ database ပါ။

အိုေက အေပၚမွာ ေျပာခဲ႔သလို db_A ကေန db_B ကို replication လုပ္မယ္ဆိုရင္။ db_A က publisher, db_B က subscriber ပါ။ publisher နဲ႔ subscriber က ကြန္ပ်ဴတာ တစ္လံုးထဲမွာ ျဖစ္နိုင္သလို၊ local area network ထဲမွာလည္း ျဖစ္နိုင္ပါတယ္။ ဒါ့အျပင္ internet ထဲမွာ ရွိတဲ႔ server ၂ လံုးမွာလည္း ျဖစ္နိုင္ပါတယ္။ distributor database ကိုလည္း publisher computer ထဲမွာ ျဖစ္ျဖစ္၊ subscriber computer ထဲမွာ ျဖစ္ျဖစ္၊ ဒါမွမဟုတ္လည္း တျခား ကြၽန္ပ်ဴတာ တစ္လံုးမွာပဲ ျဖစ္ျဖစ္ ထားလို႔ ရပါတယ္။ အခုကြၽန္ေတာ္ေျပာမယ့္ example ေလးမွာေတာ့ publisher ေရာ၊ subscriber ေရာ၊ distributor ေရာ ကို ကြန္ပ်ဴတာ တစ္လံုးထဲမွာ ထားမွာပါ(ဒီတစ္လံုးပဲရွိတာေလ) :)

ကဲ အရင္ဆံုး Replication လုပ္မယ့္ database ၂ ခုကို အရင္ေဆာက္လိုက္ပါ။ publisher လုပ္မယ့္စက္မွာ db_A နဲ႔ subscriber စက္မွာ db_B ကိုေဆာက္လိုက္ပါ။ ျပီးရင္ အဲ့ဒီ database ေတြထဲမွာ table လည္းေဆာက္ရဦးမယ္ေနာ္။ table ေဆာက္တဲ႔ေနရာမွာ database 2 ခုလံုးမွာ table အေရအတြက္ အတိအက် တူစရာမလိုပါဘူး။ ဒါေပမယ့္ replicate လုပ္မယ့္ table ေတာ့ တူရမယ္။ အခု sample အေနနဲ႔ ဒီလိုေလး ေဆာက္ေပးလိုက္ပါ။

Column Name Data Type Allow Nulls
ID int Unchecked
Name varchar(50) Checked
Remark varchar(250) Checked

ဒီေနရာမွာ မွတ္ထားဖို႔ လိုတာက replicate လုပ္မယ့္ table မွာ primary key ပါကိုပါရွိရမယ္။ ဒါေၾကာင့္ ID column ကို primary key အျဖစ္သက္မွတ္ေပးလိုက္ပါ။ database ေဆာက္ table ေတြ create လုပ္ျပီးရင္ေတာ့ replication လုပ္မယ့္ အပိုင္းေရာက္ျပီ။ replication လုပ္ဖို႔အတြက္ publisher computer ထဲမွာ Distributor configuration အရင္ လုပ္ေပးရပါမယ္။

ပံု(၂) မွာ ျပထားတဲ႔အတိုင္း SQL Server Management Studio ထဲက replication folder ကို right click လုပ္ျပီး Configure Distribution ကိုေရြးပါ။

pic_2
pic_2

ဒါဆိုရင္ ပံု(၃)မွာ ျပထားတဲ႔အတိုင္း Configure Distribution Wizard ေလး ေပၚလာပါလိမ့္မယ္။ Next ကို ဆက္ႏွိပ္လိုက္ပါ။

Pic_3
Pic_3
Pic_4
Pic_4

ပံု(၄) ကေတာ့ distributor database location ေရြးခိုင္းတာပါ။ distributor ကို publisher စက္မွာ ထားမွာလား။ ဒါမွမဟုတ္ တျခားစက္တစ္လံုးလံုးမွာ ထားမွာလားဆိုတာကို ဒီအဆင့္မွာ ေရြးနိုင္ပါတယ္။ အခုကြၽန္ေတာ္ကေတာ့ publisher စက္မွာပဲ distributor ကိုထားမွာ ျဖစ္တဲ႔အတြက္ေၾကာင့္ default အတိုင္းပဲ ထားျပီး Next ဆက္ႏွိပ္ပါမယ္။ replication လုပ္ဖို႔အတြက္ ကြၽန္ေတာ္တို႔ computer မွာ SQL Server Agent Run ေနဖို႔လိုတယ္ဗ်။ အဲ့ဒီ agent မrun ရေသးဘူးဆိုရင္ ပံု(၅) မွာျပထားတဲ႔အတိုင္း ေပၚလာလိမ့္မယ္။ run ထားျပီးသာဆိုရင္ေတ့ ေပၚမွာ မဟုတ္ပါဘူး။

Pic_5
Pic_5
Pic_6
Pic_6

ပံု(၆)-ဒီအဆင့္မွာေတာ့ snapshot folder location ေရြးခုိင္းပါတယ္။ snapshot folder ဆိုတာက publisher database မွာ changes လုပ္သမွ်ကို သိမ္းထားေပးတဲ႔ transaction log folder လို႔ ေျပာလို႔ရမယ္ထင္တယ္။ ဒီ folder ကို subscriber computer ကေန လွမ္းျပီး ဖတ္မွာ ျဖစ္လို႔ subscriber computer ကေန access လုပ္လို႔ရတဲ႔ location မွာ ျဖစ္ရပါမယ္။ ကြၽန္ေတာ္အခုလုပ္သလိုမ်ိဳး publisher နဲ႔ subscriber က same computer ဆိုရင္ေတာ့ ဒီအတိုင္းထားလိုက္လည္း ရပါတယ္။ same computer မဟုတ္ဘူးဆိုရင္ေတာ့ ဒီေနရာမွာ netword share folder location ကိုထည့္ေပးရပါမယ္။ ဒီလိုမ်ိဳးေပါ့ \\pub_computer\ReplData.

Pic_7
Pic_7

ပံု(၇)-ဒီအဆင့္မွာ ကြၽန္ေတာ္တို႔ distribution database ရဲ႕ name နဲ႔ ူlocation ကို ရိုက္ေပးရမွာပါ။ default ဒီအတိုင္းေလးပဲ ထားလိုက္ျပီး Next ပါမယ္။ ပံု(ဂ)- ပံု(၉)- ပံု(၁၀)-မွာ Next ေတြနွိပ္ျပီး Finished လိုက္ပါ။

Pic_8
Pic_8
Pic_9
Pic_9
Pic_10
Pic_10
Pic_11
Pic_11

ဒါဆို ကြၽန္ေတာ္တို႔ ပံု(၁၁) မွာ ျပထားတဲ႔အတိုင္း Distributor ကို configure လုပ္တာ ေအာင္ျမင္စြာ ျပီးဆံုးသြားပါျပီ။

အခုကြၽန္ေတာ္ Publisher စေဆာက္ပါမယ္။ ပံု(၁၂) မွာ ျပထားတဲ႔အတိုင္း Publications Folder ကို right click လုပ္ျပီး New Publication ကိုေရြးပါ။ ဒါဆို ပံု(၁၃) မွာ ျပထားသလို ေပၚလာပါလိမ့္မယ္။ Next ကိုႏွိပ္ပါ။

Pic_12

Pic_12

Pic_13

Pic_13

Pic_14

Pic_14

ပံု(၁၄)-အဆင့္မွာေတာ့ ကြၽန္ေတာ္တို႔ publication လုပ္ခ်င္တဲ႔ database ကိုေရြးေပးရမွာပါ။ အခုကြၽန္ေတာ္တို႔ db_A ကိုေရြးလိုက္ပါတယ္။ ပံု(၁၅)-အဆင့္မွာေတာ့ ကြၽန္ေတာ္တို႔ publication type ကိုေရြးေပးရမွာပါ။ publication type အဓိက ၃ မ်ိဳးရွိပါတယ္။

-       Snapshot publication

-       Transactional publication

-       Merge publication

ကြၽန္ေတာ္အခု Transactional publication ကိုေရြးျပီး Next ပါမယ္။

Pic_15

Pic_15

Pic_16

Pic_16

ပံု(၁၆)-အဆင့္မွာ ကြၽန္ေတာ္တို႔ publish လုပ္ခ်င္တဲ႔ Articles(table) ေတြကိုေရြးရပါတယ္။ ျပီးရင္ Article Properties ထဲကို ၀င္ျပီး၊ ပံု(၁၇) မွာ ျပထားတဲ႔အတိုင္း “Keep existing object unchanged” ကိုေရြးေပးလိုက္ပါမယ္။ ဆိုလိုတာကေတာ့ အကယ္လို႔ subscriber table ထဲမွာ data ေတြ ရွိေနရင္ ဒီအတိုင္းပဲ ထားမယ္လို႔ ေျပာတာပါ။

Pic_17

Pic_17

Pic_18

Pic_18

ပံု(၁၈)-အဆင့္မွာ ကြၽန္ေတာ္တို႔ article ေတြအတြက္ row filter ေပးလို႔ရပါတယ္။ table ထဲမွာ ရွိသမွ် row ေတြအားလံုးကို publish မလုပ္ပဲ condition စစ္ျပီးမွ လုပ္ခ်င္ရင္ ဒီေနရာမွာ Add button ႏွိပ္ျပီး filter ထည့္လို႔ ရပါတယ္။ အခုကြၽန္ေတာ္ကေတာ့ မထည့္ေတာ့ပါဘူး။

Pic_19

Pic_19

ပံု(၁၉)-ဒီအဆင့္မွာေတာ့ အေပၚcheckbox ေလးကို check လုပ္ျပီး Next ဆက္ႏွိပ္ပါ။ ဒါဆို ေနာက္အဆင့္မွာ ပံု(၂၀)- မွာ ျပထားတဲ႔အတိုင္း Agent Security setting လုပ္ေပးရပါမယ္။

Pic_20

Pic_20

Pic_21

Pic_21

ပံု(၂၁)-မွာ ျပထားတဲ႔အတိုင္း SQL Server Agent service account နဲ႔ run မယ္လို႔ ေျပာလိုက္ပါတယ္။ ေနာက္ျပီး Publisher database ကို ၀င္ဖို႔အတြက္ SQL Server login account ထည့္ေပးရပါတယ္။ ကြၽန္ေတာ္တို႔ SQL Server install လုပ္တုန္းက password မေပးခဲ႔ဘူးဆိုရင္ေတာ့၊ By impersonation the process account ဆိုတာကို ေရြးလိုက္ပါ။

Pic_22

Pic_22

Pic_23

Pic_23

Pic_24

Pic_24

ပံု(၂၂)- မွာ Next ႏွိပ္၊ ပံု(၂၃)- မွာ နံမည္ေပးျပီး Finished လိုက္ပါ။ ဒါဆို ပံု(၂၄)-မွာ ျပထားသလိုမ်ိဳး publisher ေဆာက္တဲ႔ ကိစၥ အဆင္ေျပသြားပါျပီ။

အခု ေနာက္ဆံုး ကြၽန္ေတာ္တို႔ Subscriber ေဆာက္ဖို႔ပဲ က်န္ပါေတာ့တယ္။ ပံု(၂၅) မွာ ျပထားတဲ႔အတိုင္း ခုနကြၽန္ေတာ္တို႔ ေဆာက္လိုက္တဲ႔ publisher ကို right click ႏွိ္ပ္ျပီး New Subscription ကိုေရြးလိုက္ပါ။

Pic_25

Pic_25

Pic_26

Pic_26

ပံု(၂၆) ကို Next လိုက္ရင္ ပံု(၂၇) မွာ ျပထားတဲ႔အတိုင္း ကြၽန္ေတာ္တို႔ အခုေရြးလိုက္တဲ႔ publisher ေလးကို ေတြ႔ရပါမယ္၊ Next ထပ္ႏွိပ္ပါ။ ဒါဆို ေနာက္တဆင့္(ပံု-၂၈)မွာ Distribution Agent location ေရြးရပါတယ္။ Distribution Agent ဆိုတာက Transactional Replication မွာ publisher ထဲက data ေတြ ဆြဲေပးတဲ႔ process ကို ေျပာတာပါ။ Transaction Replication မွာ PUSH နဲ႔ PULL ဆိုျပီး type ၂ မ်ိဳးရွိပါတယ္။ PUSH ကိုသံုးရင္ distribution agent က publisher computer ေပၚမွာေနျပီး subscriber ကို replicate data ေတြ တြန္းပို႔ေပးပါတယ္။ PULL ကိုေရြးလိုက္ရင္ေတာ့ distribution agent က subscriber computer ေပၚမွာေနျပီး publisher ဆီကေန replication data ေတြကို ဆြဲခ်ေပးပါတယ္။ အခုကြၽန္ေတာ္ကေတာ့ PUSH ကိုပဲေရြးလိုက္ပါတယ္။

Pic_27

Pic_27

Pic_28

Pic_28

ပံု(၂၉)-အဆင့္မွာေတာ့ ကြၽန္ေတာ္တို႔ subscriber database ကိုေရြးေပးရပါတယ္။ အကယ္၍ subscriber က တျခားစက္မွာဆိုရင္ “Add Subscriber” button ေလးကိုႏွိပ္ျပီး ေရြးေပးရပါမယ္။ အခုကြၽန္ေတာ္က db_B database ကိုေရြးျပီး Next လိုက္ပါမယ္။

ပံု(၃၀)-အဆင့္မွာေတာ့ Subscriber အတြက္ Distribution Agent Security Setting လုပ္ေပးရပါတယ္။ ပံု(၃၁) မွာ ျပထားတဲ႔အတိုင္း ေရြးျပီး Next လိုက္ပါဦး။

Pic_29

Pic_29

Pic_30

Pic_30

ပံု(၃၃)၊ ပံု(၃၄)၊ ပံု(၃၅) အဆင့္ဆင့္ Next ေတြ ႏွိပ္သြားလိုက္ရင္ ေနာက္ဆံုး ကြၽန္ေတာ္တို႔ Subscription process အဆင္ေျပေျပနဲ႔ ျပီးဆံုးသြားမွာပါ။

Pic_31

Pic_31

Pic_32

Pic_32

Pic_33

Pic_33

Pic_34

Pic_34

Pic_35

Pic_35

အခုကြၽန္ေတာ္တို႔ database ၂ ခု(db_A and db_B)ကို replication လုပ္လို႔ ျပီးသြားပါျပီ။ ဒီ replication တကယ္ေရာ အလုပ္လုပ္ျပီလား စမ္းၾကည့္ရေအာင္။ Databases folder ေအာက္က db_A database ကို right click လုပ္ျပီး new query ေခၚလိုက္ပါ။ ျပီး ပံု(၃၆)မွာ ျပထားတဲ႔အတိုင္း အဲ့ဒီ query ထဲမွာ INSERT STATEMENT တစ္ေၾကာင္းေရးျပီး Run လိုက္ပါမယ္။

Pic_36

Pic_36

ျပီးရင္ db_B ထဲမွာ ၀င္မ၀င္သြားစစ္ဖို႔အတြက္ db_B database အတြက္လည္း ေနာက္ထပ္ query ထပ္ယူပါမယ္။ ျပီး SELECT STATEMENT ေလး ေရးလိုက္ျပီး run လိုက္ပါ။ ကဲ.. db_A ထဲကို ကြၽန္ေတာ္ထည့္လိုက္တဲ႔ record ကို db_B ထဲမွာပါ ေတြ႔ေနရပါျပီ။

Pic_37

Pic_37

အခုကြၽန္ေတာ္ ေျပာသြားတာက database replication မွာ အရိုးရွင္းဆံုး၊ အလြယ္ဆံုး အပိုင္းေလးပါ။ အားလံုး နားလည္ၾကမယ္လို႔လည္း ေမွ်ာ္လင့္ပါတယ္။ ေနာက္မွာ ပိုျပီး ရႈပ္ေထြးတဲ႔ replication ေတြ အေၾကာင္း ဆက္ေရးပါဦးမယ္။

October 16, 2009

Basic of ASP.NET (part 3)

Filed under: Basic of ASP.NET — Tags: , , , , , , , — sevenlamp @ 9:29 AM

State Handling

ဒီေန႔ ကြၽန္ေတာ္တို႔ ASP.NET မွာ အေရးၾကီးတဲ႔ state handling အပိုင္းကို ေျပာၾကရေအာင္။ asp.net မွာ server နဲ႔ client ဆိုျပီး အလုပ္လုပ္တာကို ကြၽန္ေတာ္တို႔ သိျပီးသားေနာ္။ browser ကေန request လုပ္လိုက္တဲ႔ အခါမွ web server ထဲကိုသြားျပီး အလုပ္လုပ္တာေလ၊ variable ေတြ ေၾကျငာတာေတြ ရွိမယ္၊ class ေတြ object ေဆာက္မယ္၊ စသည္ျဖင့္ေပါ့။ ဟုတ္ျပီ အဲ့ဒီလို web server ထဲမွာ client request ေပၚမူတည္ျပီး process လုပ္လို႔ ျပီးရင္ client ဆီကို response ျပန္ပို႔ေပးတယ္။ အဲ့ဒီလို request ကို response လုပ္ျပီးတာနဲ႔ web server ထဲမွာ ေဆာက္ထားသမွ်ကို အားလံုး ရွင္းလိုက္ပါတယ္။ ဒါဆို ေနာက္ထပ္တစ္ၾကိမ္ server ကို request ျပန္လာရင္၊ ပထမတစ္ၾကိမ္တုန္းက ေဆာက္ထားသမွ်ေတြ ရွိဦးမလား? မရွိေတာ့ပါဘူး။ ဒုတိယ request အတြက္ ေနာက္ထပ္တစ္ၾကိမ္ ထပ္ျပီး object ေတြ variable ေတြ ျပန္ေၾကျငာရျပန္ပါတယ္။ response ျပီးရင္ ျပန္ဖ်က္လိုက္ျပန္ပါတယ္။ ဒီနည္းအားျဖင့္ request လာတိုင္း လာတိုင္း variable ေတြက အျမဲပဲ အသစ္အသစ္ေတြ ျဖစ္ေနတာပါ။ ဒါဆိုရင္ ပထမတစ္ၾကိမ္တုန္းက variable ထဲမွာ သိမ္းထားခဲ႔တဲ႔ value ေတြကို၊ ဒုတိယ အၾကိမ္မွာ ျပန္ေခၚမယ္ဆိုရင္ ရပါဦးမလား? မရနိုင္ေတာ့ပါဘူး။ ဒီအခ်က္က အေရးၾကီးပါတယ္။ ကြၽန္ေတာ္တို႔ variable ေတြမွာ တန္ဖိုးေတြ သိမ္းတယ္ဆိုတာ အဲ့ဒီ variable က memory ေပၚမွာ ရွိေနသေရႊ႕ပဲ သိမ္းထားလို႔ ရတာပါ။ window form application မွာ အဲ့ဒီ form(class) မွာ ေၾကျငာထားတဲ႔ variable ေတြက အဲ့ဒီ form မပိတ္မျခင္း life time ရွိပါတယ္။ web form application(asp.net) မွာေတာ့ variable တစ္ခုရဲ႕ သတ္တမ္းက request နဲ႔ response ၾကားထဲမွာပဲ ရွိပါတယ္။ ဥပမာဗ်ာ ကြၽန္ေတာ္က number အတိုးအေလွ်ာ့ လုပ္တဲ႔ program ေလး တစ္ခုေရးျပမယ္။

design

design

inc button ကိုႏွိပ္ရင္ label ထဲက value ကို ၁ တိုးမယ္။ dec ဆိုရင္ ၁ ေလွ်ာ့မယ္ေပါ့။ အိုေက ဒီ ပုစာၦေလးကို ကြၽန္ေတာ္တို႔ window application မွာ ေရးသလိုပဲ ေရးၾကည့္မယ္ဆိုရင္၊ ဒီလိုမ်ိဳး ေရးပါမယ္…

public partial class state_handling : System.Web.UI.Page
{
    int value = 0;
    protected void Page_Load(object sender, EventArgs e)
    {
        Label1.Text = value.ToString();
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        value++;
        Label1.Text = value.ToString();
    }
    protected void Button2_Click(object sender, EventArgs e)
    {
        value--;
        Label1.Text = value.ToString();
    }
}

ေရးထားတာကို ၾကည့္မယ္ဆိုရင္ေတာ့ အားလံုး မွန္တယ္လို႔ ထင္စရာပါပဲ။ ဒါေပမယ့္ run ျပီး button ေတြကို ႏွိပ္ၾကည့္လိုက္ပါဦး။ inc button ကိုႏွိပ္တိုင္း 1 ပဲ ျပေနျပီး၊ dec button ကိုႏွိပ္ရင္ေတာ့ အျမဲပဲ -1 ျဖစ္ေနပါလိမ့္မယ္။ ဘာလို႔ ဒီလို ျဖစ္ရတာလဲ? ဟုတ္ကဲ႔ ကြၽန္ေတာ္တို႔ ေၾကျငာထားတဲ႔ class variable ေၾကာင့္ပါပဲ။ button ႏွိပ္လို႔ server side ကို ျပန္လာတိုင္း ဒီ variable ကို အသစ္ျပန္ျပီး ေၾကျငာပါတယ္။ ဒါေၾကာင့္ အျမဲတမ္း 0 ျပန္ျပန္ျဖစ္သြားတာေၾကာင့္ပါ။ ဟုတ္ကဲ႔ ဒါဆိုရင္ ကြၽန္ေတာ္တို႔ variable ထဲကတန္ဖိုး မေပ်ာက္ေအာင္ ဘယ္လိုသိမ္းမလဲ? State Variable ေတြ အျဖစ္ေၾကျငာျပီး သိမ္းရပါမယ္။ state variable အမ်ိဳးအစား ၃ မ်ိဳးရွိပါတယ္။

-       ViewState

-       Session

-       Application

1) ViewState

Web page တစ္ခုအတြင္းထဲမွာ တန္ဖိုး မေပ်ာက္ေအာင္ သိမ္းခ်င္ျပီဆိုရင္ ကြၽန္ေတာ္တို႔ ViewState variable အျဖစ္ေၾကျငာျပီး သိမ္းလို႔ရပါတယ္။ ViewState variable ေၾကျငာတယ္ဆိုတာက တကယ္ေတာ့ ViewState array ထဲမွာ ေနရာ တစ္ေနရာ သြားယူလိုက္တာပါပဲ။ ကဲ ဒီ program ေလးကို ျပန္ျပင္ျပီး run ၾကည့္ရေအာင္။

public partial class state_handling : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (ViewState["value"] == null)
            ViewState["value"] = 0;
        Label1.Text = ViewState["value"].ToString();
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        ViewState["value"] = Convert.ToInt32(ViewState["value"]) + 1;
        Label1.Text = ViewState["value"].ToString();
    }
    protected void Button2_Click(object sender, EventArgs e)
    {
        ViewState["value"] = Convert.ToInt32(ViewState["value"]) - 1;
        Label1.Text = ViewState["value"].ToString();
    }
}

အရင္ဆံုး pageload event မွာ ViewState variable ေၾကျငာပါတယ္။ မေၾကျငာခင္မွာ အဲ့ဒီ variable ရွိမရွိ အရင္ စစ္ပါတယ္။ state variable ေတြက object type ပါ။ ဒါေၾကာင့္ null နဲ႔ ညီေနရင္ မေၾကျငာရေသးပါဘူး။ ဒါေၾကာင့္ ကြၽန္ေတာ္က viewstate array ထဲကို တန္ဖိုုးတစ္ခု ထည့္လိုက္ပါတယ္။ ဒါဟာ variable ေၾကျငာ လိုက္တာပါပဲ။ variable name ကို ကြၽန္ေတာ္တို႔ ၾကိဳက္တာ ေပးလို႔ရပါတယ္။ အခုကြၽန္ေတာ္က value လို႔ ေပးလိုက္ပါတယ္။ inc button ႏွိပ္ရင္ အဲ့ဒီ viewstate variable ထဲကတန္ဖိုးကို ၁ တိုးပါတယ္။ ျပီးအဲ့ဒီ variable ကို label မွာ ရိုက္ျပလိုက္တာပါပဲ။ dec button အတြက္လည္း ဒီအတိုင္းပါပဲ။ viewstate variable ကို သံုးျခင္းအားျဖင့္ ကြၽန္ေတာ္တို႔ form တစ္ခုထဲမွာ တန္ဖိုးမေပ်ာက္ေအာင္ သိမ္းလို႔ ရသြားပါျပီ။

2) Session

ကြၽန္ေတာ္တို႔ viewstate variable ထဲက တန္ဖိုးကို page တခုထဲမွာ သိမ္းထားနိုင္ပါတယ္။ ဒါေပမယ့္ ဒီpage ကေန တျခား page တခုကို သြားလိုက္ျပီဆိုတာနဲ႔ အဲ့ဒီ viewstate variable ထဲကတန္ဖိုး မရွိေတာ့ပါဘူး။ ဒါဆို ကြၽန္ေတာ္က Project ထဲမွာ ရွိတဲ႔ ဘယ္page ကိုသြားသြား တန္ဖိုးမေပ်ာက္ေစခ်င္ဘူး ဆိုရင္ေတာ့ viewstate variable ကို သံုးလို႔ မရေတာ့ပါဘူး။ ဒီလို အခ်ိန္မ်ိဳးမွာ Session variable ကိုသံုးရပါမယ္။ ဥပမာဗ်ာ.. အခုကြၽန္ေတာ္တို႔ ေရးေနတာ default.aspx ဆိုပါေတာ့။ အဲ့ဒီမွာ button တစ္ခုထပ္ထည့္ပါမယ္။ go to page2 ေပါ့။ အဲ့ဒီ button click event မွာ ဒီလိုေရးရပါမယ္။

    protected void Button3_Click(object sender, EventArgs e)
    {
        Response.Redirect("Default2.aspx");
    }

Response.Redired function က server side မွာ page တခုကေန ေနာက္တစ္ခုကို သြားဖို႔အတြက္ ေရးတာပါ။ အခုကြၽန္ေတာ္က Default2.aspx page ကိုသြားမယ္ေပါ့။ အရင္ဆံုး Defautl2.aspx page ကိုလည္း ေဆာက္ေပးထားဦးေနာ္။ အဲ့ဒီ page ထဲမွာလည္း Default.aspx ကိုျပန္သြားဖို႔အတြက္ ေပၚကလိုပဲ button ေလးထည့္ျပီး event ေရးေပးထားေပါ့။ ျပီးရင္ program ကို ျပန္စမ္းၾကည့္ပါဦး။ Default.aspx ထဲမွာ inc button ကို ၅ ခါႏွိပ္လိုက္မယ္။ ဒါဆို ၅ လို႔ ေပၚေနျပီေပါ့၊ အဲ့ဒီ အခ်ိန္မွာ go to page2 button ကိုႏွိပ္လိုက္၊ Defaut2.aspx ကိုေရာက္သြားမယ္။ go to page1 button ကိုျပန္ႏွိပ္လိုက္၊ ဒါဆို Default.aspx page ကိုျပန္ေရာက္လာျပီ။ အခုၾကည့္လိုက္ပါဦ။ ခုနတုန္းက ေရာက္လက္စ ၅ ေပၚေနေသးလား မေပၚေတာ့ဘူးေနာ္။ 0 ကေန ျပန္စသြားတာကို ေတြ႔ရပါလိမ့္မယ္။ ဒါကို ေျပာခ်င္တာပါ၊ viewstate variable ေတြက page တစ္ခုအတြင္းမွာပဲ တန္ဖိုးမေပ်ာက္ေအာင္ သိမ္းနိုင္ပါတယ္။ အိုေက အခုကြၽန္ေတာ္ Session variable နဲ႔ ေျပာင္းျပီး ျပန္စမ္းၾကည့္ပါဦး။

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (Session["value"] == null)
            Session["value"] = 0;
        Label1.Text = Session["value"].ToString();
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        Session["value"] = Convert.ToInt32(Session["value"]) + 1;
        Label1.Text = Session["value"].ToString();
    }
    protected void Button2_Click(object sender, EventArgs e)
    {
        Session["value"] = Convert.ToInt32(Session["value"]) - 1;
        Label1.Text = Session["value"].ToString();
    }
    protected void Button3_Click(object sender, EventArgs e)
    {
        Response.Redirect("Default2.aspx");
    }
}

3) Application

Session variable က user ကို ကိုယ္စားျပဳပါတယ္။ user တစ္ေယာက္ကို session တစ္ခုေပါ့။ ဒါဆို user ဆိုတာကေရာ ဘာကိုေျပာတာလဲ? User ဆိုတာက client ကြန္ပ်ဴတာရဲ႕ browser ကို ရည္ညႊန္းပါတယ္။ ဥပမာ.. ကြၽန္ေတာ္အခု ေရးထားတဲ႔ inc-dec program ကို client computer ၃ လံုးကေန ေခၚသံုးမယ္ ဆိုပါေတာ့။ client A က inc လုပ္တယ္၊ ၃ အထိေရာက္ေနျပီ။ အဲ့ဒီ အခ်ိန္မွာ client B က ၀င္လာတယ္၊ inc button ကိုႏွိပ္တယ္၊ ၄ ကေနစေပၚမလား? မေပၚပါဘူး။ ၁ ကေနပဲ စျပီး ေပၚမွာပါ။ ဆိုလိုတာကေတာ့ client A နဲ႔ client B က ဘာမွ မဆိုင္တဲ႔ သီးျခား user(session) ေတြျဖစ္လိုပါပဲ။ တခါတေလမွာ ကြၽန္ေတာ္တို႔က session အားလံုးနဲ႔ ဆိုင္တဲ႔ variable မ်ိဳး လိုခ်င္ျပီဆိုရင္ေတာ့ Session variable နဲ႔လည္း အဆင္မေျပေတာ့ပါဘူး။ ဒီအခါမ်ိဳးမွာ application variable ကို သံုးလို႔ ရပါတယ္။ ဒီလိုမ်ိဳးပါ…

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (Application["value"] == null)
            Application["value"] = 0;
        Label1.Text = Application["value"].ToString();
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        Application["value"] = Convert.ToInt32(Application["value"]) + 1;
        Label1.Text = Application["value"].ToString();
    }
    protected void Button2_Click(object sender, EventArgs e)
    {
        Application["value"] = Convert.ToInt32(Application["value"]) - 1;
        Label1.Text = Application["value"].ToString();
    }
    protected void Button3_Click(object sender, EventArgs e)
    {
        Response.Redirect("Default2.aspx");
    }
}

Note: application state test program ကို စမ္းဖို႔အတြက္ browser ၂ခု ၃ခု ဖြင့္ျပီး စမ္းၾကည့္လို႔ရပါတယ္။

October 14, 2009

basic of ASP.NET (part 2)

Filed under: Basic of ASP.NET — sevenlamp @ 10:53 AM

EVENT HANDLING

ဒီေန႔ ကြၽန္ေတာ္တို႔ ASP.NET ရဲ႕ event ေတြ အလုပ္လုပ္ပံုကို ေလ့လာလိုက္ရေအာင္။ ASP.NET မွာ server-side event အမ်ိဳးအစား ၃ မ်ိဳးရွိပါတယ္။ အဲ့ဒါေတြကေတာ့…

၁) Page Events ( Page_Load, Page_Init, …. )

၂) Cache Events (TextChanged, CheckedChanged, … )  နဲ႔

၃) Post-Back Events (Button1_Click) တိုျဖစ္ပါတယ္။

Server-side event ေတြက အေပၚမွာ ျပထားတဲ႔ အတိုင္းပဲ အစီအစဥ္လိုက္ အလုပ္လုပ္ပါတယ္။ server side ကိုေရာက္တာနဲ႔ အရင္ဆံုး Page Events ေတြက အရင္လုပ္ပါတယ္။ ျပီးရင္ cache events ေတြရွိရင္ cache events ေတြ လုပ္ပါတယ္။ ေနာက္ဆံုးမွ Post-Back event က အလုပ္လုပ္ပါတယ္။ ဒါေၾကာင့္ ကြၽန္ေတာ္တို႔ သိထားရမွာက web application မွာ button ကိုႏွိပ္လိုက္ရင္ အရင္ဆံုး အလုပ္လုပ္သြားမွာက အဲ့ဒီ button ရဲ႕ click event မဟုတ္ဘူး ဆိုတာပါပဲ။ example program ေလး တစ္ခုေလာက္ ၾကည့္လိုက္ပါ။ ရွင္းသြားမွာပါ။ web from ေလး တစ္ခု ယူျပီး TextBox တစ္ခုနဲ႔ Button တစ္ခု ထည့္လိုက္ပါ။

<body><form id=”form1″ runat=”server”>

<asp:TextBox ID=”TextBox1″ runat=”server” ontextchanged=”TextBox1_TextChanged”> </asp:TextBox>

<asp:Button ID=”Button1″ runat=”server” onclick=”Button1_Click” Text=”Button” />

</form>

</body>

ျပီးရင္ TextBox အတြက္ TextChanged Event နဲ႕ Button အတြက္ ButtonClick Event ကို cs file မွာ သြားေရးပါမယ္။ Page_Load event မွာလည္း ေအာက္မွာ ျပထားတဲ႔ အတိုင္း ေရးလိုက္ပါ။

protected void Page_Load(object sender, EventArgs e)
{
       Response.Write("--Page_Load--");
}
protected void TextBox1_TextChanged(object sender, EventArgs e)
{
       Response.Write("--TextBox1_TextChanged--");
}
protected void Button1_Click(object sender, EventArgs e)
{
       Response.Write("--Button1_Click--");
}

အိုေက.. ဒါဆိုရပါျပီ အရင္ဆံုး run ၾကည့္လိုက္ပါတယ္။ browser မွာ ဘာေတြ ေပၚလာမလဲ။ –Page Load– ဆိုတဲ႔ စာသား ေပၚလာမွာပါ။ ဘာလို႔လဲ ဆိုေတာ့ page ေပၚဖို႔အတြက္ server side ကို ပထမဆံုး request လုပ္တဲ႔ အခါ page load event ျဖစ္သြားလို႔ပါ။ အခု textbox မွာ စာရိုက္ၾကည့္ပါ။ ကြၽန္ေတာ္တို႔ ေရးထားတဲ႔ Textchanged event ျဖစ္လား။ မျဖစ္ပါဘူး။ ဘာလို႔လဲ ဆိုေတာ့ textchange event က cache event အမ်ိဳးအစားျဖစ္တာေၾကာင့္ server side ကို post back မျပန္မျခင္း အလုပ္မလုပ္ပါဘူး။ ျပီးေတာ့မွာ button ေလးကို ႏွိပ္လိုက္ပါ။ ဒါဆိုရင္ေတာ့ server side ကို postback ျပန္သြားပါလိမ္မယ္။ buton click လုပ္လိုက္ေပမယ့္ click event ကို အရင္လုပ္မွာ မဟုတ္ပါဘူး။ ပထမဆံုး PageLoad ပဲ အရင္လုပ္မွာပါ။ ေနာက္ ခုနတုန္းက cache လုပ္ထားတဲ႔ TextChanged Event ဆက္လုပ္ပါတယ္။ ေနာက္ဆံုးမွ PostBack event ျဖစ္တဲ႔ Button Click အလုပ္လုပ္သြားတာ ေတြ႔ရမွာပါ။ ဒါေၾကာင့္ page မွာ ဒါမ်ိဳး ေပၚသြားမွာပါ။

–Page_Load—-TextBox1_TextChanged—-Button1_Click–

October 13, 2009

basic of ASP.NET (part 1)

Filed under: Basic of ASP.NET — sevenlamp @ 11:42 AM

Basic of ASP.NET

Microsoft platform ေပၚမွာ ကြၽန္ေတာ္တို႔ web application ေတြေရးေတာ့မယ္ဆိုရင္ အရင္တုန္းက Active Server Page(ASP) ကိုသံုးခဲ႔ၾကပါတယ္။ classic ASP လို႔လည္း ေခၚပါတယ္။ အခုေနာက္ပိုင္းမွာေတာ့ .net framework ကို အေျခခံတဲ႔ ASP.NET ကိုပိုျပီး အသံုးမ်ားလာၾကပါျပီ။ ASP.NET ဟာ classic ASP ရဲ႕ next generation ျဖစ္ေပမယ့္ လံုး၀ မတူေတာ့ သေလာက္ ေျပာင္းလဲမႈေတြ အမ်ားၾကီး လုပ္ထားပါတယ္။ အဓိကအားျဖင့္ေတာ့ classic ASP က interpreted language ျဖစ္ျပီး၊ ASP.NET ကေတာ့ Compiled language ပါ။ ASP.NET က .NET Framework နဲ႔ integrated လုပ္ထားျပီး Object-oriented လည္း ျဖစ္ပါတယ္။ classic ASP မွာ server side coding အတြက္ VBScript ကိုသံုးရျပီး၊ ASP.NET မွာေတာ့ .NET Frameword ထဲက ၾကိဳက္တဲ႔ language နဲ႔ ေရးလို႔ ရပါတယ္။ အသံုးမ်ားတာကေတာ့ C#.NET နဲ႔ VB.NET ေပါ့။ ကြၽန္ေတာ္ကေတာ့ C#.NET language နဲ႔ သံုးသြားမွာျဖစ္ပါတယ္။

ကြၽန္ေတာ္တို႔ desktop application (window application) ေတြေရးခဲ႔တုန္းက ကြၽန္ေတာ္တို႔ ေရးခဲ႔တဲ႔ program ကို computer တစ္လံုးမွာထည့္ထားလိုက္ရင္ အဲ႔ဒီ computer မွာပဲ သံုးခြင့္ရွိပါတယ္။ တျခား ကြန္ပ်ဴတာေတြကေန ေခၚသံုးလို႔ မရပါဘူး။ web application ကေတာ့ ဒီလို မဟုတ္ပါဘူး ကြၽန္ေတာ္က computer တစ္လံုးမွာ သြင္းထားလိုက္ရင္ အဲ႔ဒီ computer နဲ႔ network ခ်ိတ္ဆက္ထားတဲ႔ ကြန္ပ်ဴတာေတြ အားလံုးကေန ေခၚျပီး သံုးခြင့္ရွိပါတယ္။ ဒီအခါမွာ ကြၽန္ေတာ္ Program သြင္းထားတဲ႔ computer ကို server computer လို႔ ေခၚျပီး၊ တျခား ေခၚသံုး ခ်င္တဲ႔ computer ေတြကေတာ့ client computer ေတြေပါ့။ အဲ့ဒီ server computer မွာ ကြၽန္ေတာ္တို႔ program ထည့္ဖို႔အတြက္ Internet Information Service (IIS) ရွိရမွာျဖစ္ပါတယ္။ ကြၽန္ေတာ္တို႔ program ကို IIS ထဲမွာ directory တစ္ခုအေနနဲ႔ ထည့္ေပးထားရပါမယ္။ IIS က Microsoft window component တစ္ခု ျဖစ္ပါတယ္။ IIS ထဲမွာ ရွိတဲ႔ ကြၽန္ေတာ္တို႔ program ကို client computer ေတြကေန ေခၚသံုးမယ္ဆိုရင္ေတာ့ Internet Explorer ( or any browser ) ကိုသံုးရပါတယ္။


ဟုတ္ျပီ.. အခုကြၽန္ေတာ္တို႔ ASP.NET အလုပ္လုပ္ပံုကို ဆက္ေျပာရေအာင္။ browser address bar မွာ ကြၽန္ေတာ္တို႔ http://www.google.com ရိုက္လိုက္ျပီ ဆိုပါေတာ့၊ ဒါဆို google server computer ရဲ႕ web server ကိုေရာက္သြားပါမယ္။ ဒါကို request လုပ္တယ္လို႔ ေခၚပါတယ္။ server က client ရဲ႕ request ကို မူတည္ျပီး ပံုေသာ္လည္းေကာင္း၊ html page အျဖစ္ေသာ္လည္းေကာင္း၊ client ကို ျပန္ပို႔ေပးပါတယ္။ ဒါကို response ျပန္တယ္လို႔ ေခၚပါတယ္။ ျပန္လာတဲ႔ response ကိုမွ browser ကေန ျပန္ျပေပးပါတယ္။ အိုေက ဒါဆိုရင္ google ရဲ႕ default page က်လာျပီေပါ့။ အဲ့ဒီမွာ ကြၽန္ေတာ္က ရွာခ်င္တဲ႔ စာသားတစ္ခုကို ရိုက္ျပီး search ကို ႏွိပ္လိုက္တယ္ဆိုရင္ browser ကေန server ကို ေနာက္တစ္ၾကိမ္ request လုပ္ပါတယ္။ ဒီ request ထဲမွာ ပါလာတဲ႔ search word ကို database ထဲမွာ ရွာမယ္၊ ျပီးရင္ client ကို response ျပန္ပါမယ္။ ဒီနည္းအားျဖင့္ server နဲ႔ client အျပန္အလွန္ အလုပ္လုပ္ေပးပါတယ္။ client ကေန server ကိုသြားတဲ႔ request object မွာ method ၂ ခုခြဲနိုင္ပါတယ္။ ပထမဆံုး အၾကိမ္ သြားတဲ႔ အခါ get method နဲ႔ သြားျပီး ေနာက္အၾကိမ္ေတြမွာေတာ့ post method နဲ႔ သြားပါတယ္။ ကြၽန္ေတာ္တို႔ server side မွာ အလုပ္လုပ္မယ့္ coding ေတြကို C# language နဲ႔ cs file ထဲမွာ ေရးေလ့ရွိပါတယ္။ client side မွာ အလုပ္လုပ္မယ့္ code ေတြကိုေတာ့ aspx file ထဲမွာ ေရးပါတယ္။ cs file ထဲမွာ ကြၽန္ေတာ္တို႔ ေရးထားတဲ႔ code ေတြက server ကို request လာတဲ႔ အခ်ိန္မွာ အလုပ္လုပ္ေပးျပီး၊ pure html အျဖစ္ client ကို response ျပန္ပါတယ္။
အခု ကြၽန္ေတာ္တို႔ ပထမဆံုး asp.net program တစ္ခု စေရးၾကရေအာင္။ VS 2008 ကိုဖြင့္လုိက္ပါ။ ျပီးရင္ File -> New -> Web Site ကို ေရြးလိုက္ပါ။ ျပီးရင္ localhost ေအာက္မွာ ကြၽန္ေတာ္တို႔ website ေလးကို နံမည္ေပးျပီး ok လုပ္ပါမယ္။ ကြၽန္ေတာ္ကေတာ့ website အတိုင္းပဲ ထားလိုက္ပါတယ္။ ဒီေနရာမွာ localhost ဆိုတာ ကြၽန္ေတာ္တို႔ computer မွာ ရွိတဲ႔ IIS ကို ရည္ညႊန္းတာ ျဖစ္ပါတယ္။


ျပီးရင္ Default.aspx.cs file ကိုဖြင့္လိုက္ပါ။ page load event ထဲမွာ ဒီ code ကိုရိုက္ျပီး run ၾကည့္ပါဦး။

protected void Page_Load(object sender, EventArgs e)
{
       Response.Write("<h1>Hi everybody</h1><h3>welcome to you all</h3>");
}

ကြၽန္ေတာ္တို႔ program ရဲ႕ output ကို Internet Explorer ထဲမွာ ခုလိုမ်ိဳး ေတြ႕ၾကရမွာပါ။

October 7, 2009

create your database

Filed under: SQL Server 2005 — sevenlamp @ 10:24 AM

ကိုေက်ာ္စြာရဲ႕ cbox ထဲက ေမးခြန္းေလးကို ေျဖေပးရင္းနဲ႔ ကြၽန္ေတာ္ SQL Server 2005 မွာ database တည္ေဆာက္ပံုေလး ေျပာျပေပးခ်င္ပါတယ္။ အရင္ဆံုး SQL Server 2005 ကို run ဖို႔အတြက္ START-> ALL PROGRAM -> MICROSOFT SQL SERVER 2005 -> SQL SERVER MANAGEMENT STUDIO ကို click လိုက္ပါ။ ဒါဆိုရင္ sql server management studio ပြင့္လာျပီး database server login ေတာင္းပါလိမ့္မယ္။ server name ေနရာမွာ ကြၽန္ေတာတို႔က ကိုယ့္စက္ကိုယ္ ဖြင့္မွာျဖစ္လို႔ computer name ဒါမွမဟုတ္ local ဒါမွမဟုတ္ (.) ေလးထည့္ေပးရပါမယ္။ authentication အေကာင့္ အတြက္ေတာ့ ၂ မ်ိဳးေရြးလို႔ရပါတယ္၊ window authentication နဲ႔ ၀င္မယ္ဆိုရင္ login name နဲ႔ password ေပးစရာမလိုပါဘူး။ SQL Server Authentication နဲ႔ ၀င္ရင္ေတာ့ default login name က (sa) ပါ၊ password ကေတာ့ ကြၽန္ေတာ္တို႔ SQL Server install လုပ္တုန္းက ေပးထားခဲ႔တဲ႔ password ကိုသံုးရပါမယ္။ တကယ္လို႔ SQL Server install လုပ္တုန္းက မေပးခဲ႔ဘူး ဆိုရင္ေတာ့ window authentication ကိုပဲ ေရြးျပီး ၀င္လိုက္ပါ။

အခုကြၽန္ေတာ္တို႔ server ထဲကို ေရာက္ပါျပီ။ အဲ့ဒီမွာ object explorer ကိုေတြ႔ရမွာပါ။ မေတြ႔ရင္ View Menu -> object explorer ကိုေရြးလိုက္ပါ။ object explorer ထဲမွာ Databases, Security, Replication စသည္ျဖင့္ tree nodes ေလးေတြ ေတြ႔ရပါမယ္။ အဲ့ဒီ ထဲက Databases nodes ေလးထဲကို ထပ္၀င္လိုက္ရင္ ကြၽန္ေတာ္တို႔ လက္ရွိ တည္ေဆာက္ထားတဲ႔ databases ေတြကို ေတြ႔ရပါလိမ့္မယ္။ အခုကြၽန္ေတာ္တို႔ database တစ္ခု အသစ္ေဆာက္ဖို႔အတြက္ Databases node ေလးကို right click လုပ္ျပီး new database ဆိုတာကို ေရြးလိုက္ပါ။ new Database window ေလး ေပၚလာပါမယ္။ အဲ့ဒီက database name textbox ထဲမွာ ကြၽန္ေတာ္တို႔ တည္ေဆာက္ခ်င္တဲ႔ database အမည္ေလးထည့္ပါ။ owner ကေတာ့ default ပဲထားလိုက္ပါ။ database တစ္ခုအတြက္ .mdf file နဲ႔ .ldf file ဆိုျပီး file ၂ ခု ေဆာက္ေပးပါလိမ့္မယ္၊ ေဆာက္ေပးမယ့္ default location က C:\ ေအာက္က Sql server သြင္းထားတဲ႔ location မွာပါ။ ဒါကို ကြၽန္ေတာ္တို႔ ၾကိဳက္တဲ႔ location မွာ သြားေဆာက္လို႔လည္း ရပါတယ္၊ database files ဇယားကြက္ထဲက Path ဆိုတဲ႔ ေနရာမွာ သြားေရြးေပးလိုက္ပါ။ ျပီးရင္ေတာ့ OK လုပ္လိုက္ပါ၊ ဒါဆိုရင္ အခု ကြၽန္ေတာ္တို႔ ကိုယ္ပိုင္ database ေလးေဆာက္လို႔ ျပီးပါျပီ။

ဒီ database ေလးထဲမွာ data ေတြသိမ္းဖို႔အတြက္ table ေတြ ထပ္ေဆာက္ေပးဖို႔ လိုအပ္ပါေသးတယ္။ အဲ့ဒီ အတြက္ databases node ေလးထဲက ကြၽန္ေတာ္တို႔ အသစ္ေဆာက္လိုက္တဲ႔ database အမည္ေလးကို ထပ္ဖြင့္လိုက္ရင္ Database Diagrams, Tables, Views စသည္ျဖင့္ ထပ္ေတြ႔ရပါမယ္။ အဲ့ဒီမွာ Tables nodes ေလးကို right click လုပ္ျပီး new table ကို ေရြးလိုက္ပါ။ ဒါဆို ကြၽန္ေတာ္တို႔ table အသစ္ေဆာက္ဖို႔ ေနရာကို ေရာက္ပါမယ္။ အဲ့ဒီ ေနရာမွာ ကြၽန္ေတာ္တို႔ table ထဲမွာ သိမ္းခ်င္တဲ႔ record ေတြအတြက္ သိမ္းမယ့္ column(field) ေတြေၾကျငာေပးရပါမယ္။ column name ေနရာမွာ ကိုယ္ၾကိဳက္တယ္ အမည္ေပးရမယ္၊ တခု သတိထားဖို႔က အဲ့ဒီ အမည္အတြက္ space ေတြ မထည့္ေပးပါနဲ႔။ ထည့္ေပးလို႔ မရဘူးမဟုတ္ဘူးေနာ္၊ မထည့္ေပးတာက program ေတြကေန ျပန္ေခၚသံုးမယ့္ အခါ ပိုျပီး အဆင္ေျပေစပါတယ္။ ျပီးရင္ အဲ့ဒီ column အတြက္ သိမ္းမယ့္ data type ကို ေၾကျငာေပးရပါမယ္။ allow null ဆိုတဲ႔ checkbox ေလးကေတာ့ ကြၽန္ေတာ္တို႔ အခုေဆာက္လိုက္တဲ႔ column ေလးမွာ data မထည့္လို႔ မရဘူး၊ ထည့္ကို ထည့္ရမယ္လို႔ သက္မွတ္ခ်င္ရင္ off လုပ္ရျပီး၊ မထည့္လည္း ရမယ္ဆိုရင္ on ေပးရမွာပါ။ ဒီနည္းအားျဖင့္ ကြၽန္ေတာ္တို႔ စိတ္ၾကိဳက္ ေကာ္လံေတြ ေဆာက္ေပးရပါမယ္။
ဥပမာ အားျဖင့္

column name data type allow nulls
CategoryID int off
CategoryName varchar(50) on

စသည္ျဖင့္ေပါ့။

columns ေတြ ေဆာက္လို႔ ျပီးျပီဆိုရင္ table တစ္ခုမွာ လိုအပ္တဲ႔ primary key ကိုသက္မွတ္ေပးရပါမယ္။ ကိုယ္ သက္မွတ္ခ်င္တဲ႔ column ေလးကို ေရြးျပီး toolbar ေပၚက ေသာ့ပံု icon ေလးကို ႏွိပ္လိုက္ရံုပါပဲ။ ျပီး အဲ့ဒီ primary key ကို auto တိုးသြားေစခ်င္ရင္ေတာ့ ေအာက္နားက column properties ထဲမွာ Identity Specification ဆိုတာ ေနရာမွာ (Is Identity) ကို Yes လုပ္ေပးရပါမယ္။ အားလံုးျပီးသြားျပီဆိုရင္ ကြၽန္ေတာ္တို႔ အခုေဆာက္လိုက္တဲ႔ table ေလးကို save လုပ္လိုက္ပါေတာ့။ အိုေက ဒါဆိုရင္ အခုကြၽန္ေတာ္တို႔ table ေတြ ေဆာက္တက္ပါျပီ။

ကြၽန္ေတာ္ နမူနာေလး ေဆာက္ျပထားတဲ႔ video training ေလးကို ဒီမွာ ေဒါင္းျပီး ၾကည့္ၾကည့္လို႔ ရပါတယ္။
http://www.sendspace.com/file/0i0j43

October 2, 2009

basic of C# (part 25)

Filed under: Basic of C# — Tags: , , , , , — sevenlamp @ 10:21 AM

Function Overloading Vs Function Overriding

ကြၽန္ေတာ္တို႔ ဒီေန႔ function overloading နဲ႔ function overriding အေၾကာင္းေလး ေျပာၾကရေအာင္။ အရင္ဆံုး function overloading အေၾကာင္းေျပာရေအာင္။ overload ဆိုတာ အလုပ္တစ္ခုထက္ပိုျပီး လုပ္တာကို ေျပာခ်င္တာပါ။ function overloading ဆိုေတာ့ ကြၽန္ေတာ္တို႔ ေရးလိုက္တဲ႔ function က တာ၀န္ တစ္ခုထက္ပိုျပီး လုပ္ေဆာင္ေပးတာကိုရည္ရြယ္တာပါ။ function name က တစ္ခုထဲပဲ ဒါေပမယ့္ လုပ္ေဆာင္မႈအမ်ားၾကီး လုပ္နိုင္ေအာင္ေပါ့။ ဥပမာဗ်ာ.. ကြၽန္ေတာ္က string ကေန integer ေျပာင္းတဲ႔ function ေလးတစ္ခုေလာက္ ေရးခ်င္တယ္။

static int ConvertToInteger(string st)
{
    try
    {
        return Convert.ToInt32(st);
    }
    catch
    {
        return 0;
    }
}

ကဲ.. ဒီ function ေလး ေရးလိုက္ျခင္းအားျဖင့္ ကြၽန္ေတာ္တို႔ string ကေန integer ေျပာင္းခ်င္တိုင္း လြယ္လြယ္ကူကူ ေခၚလို႔ ရသြားမယ္။ ဒါေပမယ့္ တျခား type ေတြကေနေျပာင္းခ်င္ရင္ ဒီ function သံုးလို႔ ရမလား။ မရပါဘူး။ ဒါဆို ကြၽန္ေတာ္က တျခားtype ေတြ အတြက္ကိုလည္း ဒီလိုမ်ိဳး function ေတြ ထပ္ေရးေပးဖို႔ လိုပါလိမ့္မယ္။

static int ConvertToInteger(decimal dec)
{
    try
    {
        return Convert.ToInt32(dec);
    }
    catch
    {
        return 0;
    }
}
static int ConvertToInteger(long l)
{
    try
    {
        return Convert.ToInt32(l);
    }
    catch
    {
        return 0;
    }
}

ဟုတ္ျပီေနာ္.. အခုလိုမ်ိဳး function name တူျပီး parameter မတူတဲ႔ function ေတြ တစ္ခုထက္ပိုျပီး ေရးလိုက္တာကို function overloading လုပ္တယ္လို႔ ေခၚပါတယ္။ function overloading လုပ္ျခင္း အားျဖင့္ ဘာပိုေကာင္းလာမလဲ။ ဟုတ္ကဲ႔ ကြၽန္ေတာ္တို႔ program ေရးတဲ႔ေနရာမွာ အမ်ားၾကီးပိုျပီး လြယ္ကူေစပါတယ္။ အကယ္လို႔သာ function overload မလုပ္ရဘူးဆိုရင္ ကြၽန္ေတာ္တို႔ string ကေန integer ေျပာင္းဖို႔အတြက္က function name တစ္ခု၊ decimal ကေန integer ေျပာင္းဖို႔အတြက္က function name တစ္ခု၊ long ကေန integer ေျပာင္းဖို႔အတြက္က function name တစ္ခု စသည္ျဖင့္ name ေတြ အမ်ားၾကီး သံုးေနမွတ္ေနရမွာေပါ့။ အခု overloading လုပ္ျခင္းအားျဖင့္ function name တစ္ခုထဲကိုပဲ သိဖို႔ လိုပါေတာ့တယ္။ Framework class library ထဲမွာလည္း overload လုပ္ထားတဲ႔ function ေတြ အမ်ားၾကီး ေတြရမွာပါ။ ကဲ အႏွစ္ခ်ဳပ္ျပန္ေျပာပါမယ္ function overloading ျဖစ္ဖို႔အတြက္ function name တူရပါမယ္၊ argument (parameter) မတူရပါဘူး။ parameter မတူရဘူး ဆိုတာမွာ parameter ရဲ႕ datatype ျဖစ္ေစ၊ အရည္အတြက္ ျဖစ္ေစမတူရင္ ရပါတယ္။

ေနာက္တစ္ခုကေတာ့ function overriding။ overriding လို႔ ေျပာတဲ႔ အတိုင္းပါပဲ၊ function overrideing ဆိုတာက function တစ္ခုေပၚမွာ ေနာက္ထပ္ function တစ္ခုနဲ႔ ထပ္ျပီး အုပ္လိုက္တာကို ေျပာခ်င္တာပါ။ ဒီလိုလုပ္လိုက္ရင္ function ၂ ခု ျဖစ္သြားမလား၊ မျဖစ္ပါဘူး။ override လုပ္ျခင္းခံရတဲ႔ function က ေပ်ာက္သြားမွာပါ။ function overrideing ကို အဓိကအားျဖင့္ polymorphism နဲ႔ တြဲျပီးသံုးေလ့ ရွိပါတယ္။ parent class ထဲမွာ ရွိျပီးသား function တစ္ခုကို child class ထဲမွာျပန္ျပီးေရးခ်င္တယ္ ဆိုရင္ override လုပ္ဖို႔ လိုလာပါျပီ။ ဒီလို အခ်ိန္မ်ိဳးမွာ function overriding ကိုသံုးပါတယ္။ ဥပမာေလးနဲ႔ ေျပာရရင္… ကြၽန္ေတာ္မွာ animal ဆိုတဲ႔ class ရွိတယ္ဗ်ာ၊ parent class ေပါ့၊ အဲ့ဒီ animal class ထဲမွာ eat() ဆိုတဲ႔ function ေလးပါတယ္။

class animal
{
    public void eat()
    {
        Console.WriteLine("Eat something");
    }
}

အိုေက.. အဲ့ဒီ animal class မွာ child class ၂ ခုရွိတယ္။ dog class နဲ႔ ant class ေပါ့။ အဲ့ဒီ dog class နဲ႔ ant class က animal class ကေန inheritance လုပ္ထားတာျဖစ္တဲ႔ အတြက္ သူတို႔ဆီမွာ eat() function အလိုအေလွ်ာက္ ပါလာပါတယ္။ အဲ့ဒီ parent class ကေနပါလာတဲ႔ eat() function ထဲက statement ေတြကို child class မွာ မလိုခ်င္ဘူး။ ပိုျပီး detail ၾကတဲ႔ message နဲ႔ အစားထိုးခ်င္တယ္ဆိုပါေတာ့ (ဥပမာ.. Eat something အစား၊ Eat Bone တို႔ Eat sugur တို႔နဲ႔ အစားထိုးခ်င္ျပီဆိုရင္)၊ ဒါဆို ဘယ္လိုလုပ္မလဲ? ေနာက္ထပ္ function တစ္ခုထပ္ေဆာက္ခ်င္တာ မဟုတ္ဘူးေနာ္၊ parameter လည္း မေျပာင္းတဲ႔ အတြက္ overloading လည္း လုပ္လို႔ မရဘူး။ ဒီလို အေျခအေနမ်ိဳးမွာ ကြၽန္ေတာ္တို႔ မျဖစ္မေန function overriding လုပ္ဖို႔ လိုလာပါျပီ။

ဒါဆို function overriding လုပ္ဖို႔ ဘာလိုမလဲ? Parent class ထဲမွာ ဒီတိုင္းေရးထားတဲ႔ function တိုင္းကိုေတာ့ override လုပ္လို႔ မရပါဘူး။ override လုပ္ဖို႔ ခြင့္ျပဳထားတဲ႔ function ေတြကိုပဲ လုပ္လို႔ရတာပါ။ ဒီလို override လုပ္ဖို႔ ခြင့္ျပဳခ်င္တယ္ဆိုရင္ parent class ထဲက function ရဲ႕ေရွ႕မွာ virtual ဆိုတဲ႔ keyword ေလးထည့္ေရးေပးလိုက္ရပါတယ္။

class animal
{
    public virtual void eat()
    {
        Console.WriteLine("Eat something");
    }
}

override ျပန္လုပ္မယ့္ child class က function ေရွ႕မွာေတာ့ override ဆိုတဲ႔ keywordကို ထည့္ေပးရပါတယ္။

class dog : animal
{
    public override void eat()
    {
        Console.WriteLine("Eat Bone!");
    }
}

ကဲ… example program ေလး တစ္ခုေလာက္ေရးၾကည့္ပါဦး။

class animal
{
    public virtual void eat()
    {
        Console.WriteLine("Animal: Eat something");
    }
}
class dog : animal
{
    public override void eat() // function overriding
    {
        Console.WriteLine("Dog: Eat Bone!");
    }
}
class ant : animal
{
    public override void eat()
    {
        Console.WriteLine("Ant: Eat Sugar");
    }
}
class Program
{
    static void Main()
    {
        animal obj;
        obj = new animal();
        obj.eat();

        obj = new dog(); //polymorphism
        obj.eat();

        obj = new ant();
        obj.eat();

        Console.Read();
    }
}

Basic of C# ကို ကြၽန္ေတာ္ဒီမွာပဲ ရပ္လိုက္ပါေတာ့မယ္။ အခုေလာက္ဆိုရင္ ကြၽန္ေတာ္တို႔ C# ဆိုတာ ဘာလဲသိေလာက္ပါျပီ။ OOP အေၾကာင္းလည္း နည္းနည္းေတာ့ နားလည္ေလာက္ျပီလို႔ ယူဆပါတယ္။ ေနာက္ပိုဒ႔္ေတြမွာ window application အပိုင္းနဲ႔ web application အပိုင္းကို ဆက္ေရးသြားပါ့မယ္ခင္ဗ်ာ။

Theme: Silver is the New Black. Blog at WordPress.com.

Follow

Get every new post delivered to your Inbox.