تری ویو در پایگاه داده(Save and Load TreeView in DB)-معرفی نوع دادهHIERARCHYID در Sql Server 2008

نوشته شده بوسیله تبسم 22. آبان 1388 20:22

سلام بچه ها (منظور دوستان، بهتون برنخوره حالا ! :دی)                            (بخش دوم)

خوب رسیده بودیم تا اونجاییکه تا یه سطح به درختمون (TreeView مون) با کمک نوع داده جدید Sql Server 2008 نود اضافه کردیم که اسمش بود HierarchyID (هایرآرکی آی دی). حالا ادامه ش رو با هم بررسی می کنیم:

1. اول یه New Query باز کنین توی محیط Sql server 2008 تون و بعد مشابه روال قبلی کد زیر رو برای اضافه کردن نود جدید در سطح 2 و سطح 3 می نویسیم و توی همون پایگاه داده اجرا می گیریم ازش:

کدها:

clip_image002اجراش:

clip_image004

 

 

 

 

به همین ترتیب می تونیم نودها رو اضافه کنیم. همین طور که توی اجراش می بینین با دنبال کردن نودها و سطح ها خیلی راحت می تونین ساختار درختیتون رو رسم کنین.

از  این آدرس می تونین یه فیلم آموزشی راجع به این نوع داده ببینین.

فایلش رو از ابتدا تا انتهاش براتون می ذارم. فقط باید توی SQL Server 2008 بازش کنین (یا اگر نصب کرده باشین برنامه رو، فقط کافیه روی فایل کلیک کنین) و توی دیتابیسی که ساختین اجراش کنین. جداولش با مقدارهاش ساخته می شه. می تونین با کلیک روی Table ببینینش.(جلسه قبل توضیح دادم.)

اینم فایلش :

 

TreeviewHierarchyID.sql (1.62 kb)

موفق باشین.

 

تری ویو در پایگاه داده(Save and Load TreeView in DB)-معرفی نوع دادهHIERARCHYID در Sql Server 2008

نوشته شده بوسیله تبسم 22. آبان 1388 16:17

سلام دوستان.                                                                        (بخش اول)

تمرین تری ویو (TreeView) که یادتونه؟ خوب ما توی اون تمرین به کاربرمون اجازه می دادیم که یه نود به نودهای تری ویو اضافه کنه، براش اسم و توضیحات ثبت کنه و جاش رو هم خودش انتخاب کنه. اما وقتی کاربر پنجره رو می بست چون ما اطلاعاتش رو توی یک پایگاه داده ثبت نکرده بودیم، اطلاعاتش از دست می رفت یا اصطلاحا می پرید. حالا باید براش یه پایگاه داده تعریف کنیم تا بتونه اطلاعات رو اونجا سیو کنه و بعد هم بتونه اطلاعات ذخیره شدش رو لود کنه. فعلا با ظاهر برنامه که شاید براش دو تا دکمه ی Save  و Load بذاریم کاری نداریم. برای اینکه برنامه ی قبلیمون رو که از سیستم لایه ای توش استفاده کردیم، کامل کنیم نیاز به  لایه ی DAL داریم . حتما یادتون مونده که در لایه ی DAL برنامه ی ما با پایگاه داده ارتباط برقرار می کرد و این لایه مثل یه پل بین برنامه و پایگاه داده عمل می کرد. (دلایلش رو رجوع کنید به پست های قبلی- دفترچه تلفن با معماری سه لایه).

حالا می خوام یه کم راجع به پایگاه داده ی مربوط به این مثال صحبت کنیم. توی این مثال همونطور که قبلا هم توضیح دادم ما یه جور نمایش درختی و سلسله مراتبی داریم. یعنی چی؟ یعنی نود ها به هم ارتباط دارن. یک پدر با چندین بچه که هر کدوم از اون بچه ها خودشون می تونن پدر باشن برای بچه های دیگه. پس چیزی که مهمه اینه که ما جای هر نود رو نگه داریم و بتونیم پیدا کنیم. اینکه هر نود پدرش مثلا کی بوده.

روش های مختلفی هست. می شه از انواع داده XML برای نگه داشتن این اطلاعات سلسله مراتبی استفاده کرد، می شه هم یه سری جدول (Table) توی مثلا SQL یا برنامه های مشابه ش داشت و با یه سری ارتباط که بین جداول هست (Relational Table) و یه سری دستورات Self Join و ... جای نودها رو نگه داشت و اطلاعات رو ذخیره کرد که گاهی پیچیده می شه.

Hierarchyid  جدید تعریف شده به نام   (Data Type)یک نوع داده SQL SERVER 2008 اما خوشبختانه در که یک امکان بسیار عالی و راحتتر برای نگهداری و کدنویسیه داده های سلسله مراتبی هست. این نوع داده یک دیتا تایپ محلی مثل انواع داده ای DATE  و Time  نیست ،یک نوع داده ایه که بهش می گن:  ( System - Defined UDT(User Data Type .یعنی شما نمی تونین نامش رو تغییر بدین یا پاکش کنید و در واقع انواعی هستند که کدشون برای راحتی کاربر نوشته می شن یا کاربر می تونه خودش تعریفش کنه .... این نوع داده در  Microsoft.SqlServer.Types.dll ذخیره شده که در                    فضای نام Name Space) ِ   Microsoft.SqlServer.Types)   ساخته شده.

به طور کلی کار این نوع داده اینه که جای نودها رو برای ما نگه می داره. یه سری تابع نوشته شده داره که با استفاده از اونها مثلا شما می تونید راحت نود ریشه(()GetRoot) رو بدست بیارین و یا سطح هر بچه رو یا پدرش رو(()GetLeve). در واقع اون تابع های پیچیده ای که باید می نوشتیم تعریف شدن و شما فقط کافیه ازشون استفاده کنین.

با یه مثال مشابه برنامه ای که می خواهیم برای تری ویو (Save in treeview and Load from treeview) بنویسم تا حدودی توی این پست براتون توضیح می دم چه جوری کار می کنه.توی پست بعدی یه کتاب معرفی می کنم که می تونه بیشتر کمک کنه، احتمالا.

توجه:برای استفاده از این نوع داده شما حتما باید از Sql Server 2008 استفاده کنین. برای اینکه پست بعدی رو با هم پیش بریم یا دی وی دی ش رو از بیرون تهیه کنین و نصب کنید یا از این آدرس که در ادامه پست می ذارم نسخه ی Express ش رو فعلا دانلود کنید. ممکنه نصب Sql Server 2008 یه کمی زمان بر باشه و یه سری کارها و نصب مقدمات ضروری نیاز داشته باشه مثل نصب Visual Studio Service Pack1 که اونم می تونین از سایت مایکروسافت دانلود کنین. اگر به مشکلی در نصب برنامه (ترجیحا: Microsoft Sql Server 2008, Developer Edition + Service Pack1 رو تهیه کنین)برخوردین بپرسین چون خودم  یه چیزایش رو تجربه کردم.

اینم آدرس لینک برای دانلود: http://www.microsoft.com/express/sql/download/  از سمت راست دومی ، اونی که 224 مگا بایته رو دانلود کنین فعلا.

و اما مثال: (البته فایلش رو هم براتون می ذارم انتهای پست.)

به ترتیب کارهایی که می گم رو با من انجام بدین، ضمن اینکه به این شکل (گیر ندین دیگه به جزئیات شکل :دی خواستم مفهوم باشه!) هم دقت کنین:

1.توی DataBase تون یه راست کلیک کنین و یه دیتابیس جدید بسازین. (New DataBase…)  و اسمش رو هر چی دوست دارین بذارین. من گذاشتم : HierarchyIDType

2. یه صفحه New Query باز کنین توی SQL Server 2008 تون.

3. این کد رو توش بنویسین، بعد توی همین دیتابیسی که ساختین F5 یا دکمه Execute رو بزنین .جدولش ساخته می شه، برین ستون هاش رو ببینین.ستون node که کلید اصلی ماست از جنس هایرآیکی تعریف شده و ستون بعدی level که اگر دقت کنین جلوش نوشته شده (Computed) در واقع یه ستون محاسبه شده ست. این یعنی چی؟ یعنی با اون تابع پیش فرض (GetLevel )که برای این نوع داده تعریف شده(که بهش   می گن: deterministic function)، سطح نود ِ node رو حساب می کنه و برمیگردونه. یعنی چی حالا سطح نود رو برمیگردونه؟ یعنی مثلا توی مثال ما نود موجودات  سطح ش صفره، بعد جانداران و بی جان ها سطحشون 1 و همین طور سطح ها اضافه می شه.حله؟! این برای اینکه فرزندهای پدرها رو رد یابی کنیم به دردمون می خوره.

Create Table Mujudats

)

,node hierarchyid PRIMARY KEY CLUSTERED

,level AS node.GetLevel() PERSISTED

,Mujud_id int Unique

Mujud_name Nvarchar(30) Not null

(

4. حالا برای اینکه یه اجرا ببین که چه جوریه توی یه صفحه ی دیگه ی New query کد زیر رو بنویسن و توی همین دیتابیس اجراش کنین.

insert into Mujudats 's table----

('INSERT INTO [dbo].Mujudats VALUES (HierarchyID :: GetRoot(),5000,'Mujudat

با این کد نود ریشه مون رو با نام Mujudat که Mujud_id ش برابر با 5000  ه و mujud_name ش می شه همون mujudat رو اضافه می کنیم به تیبلمون که level اینجا برابر با صفر خواهد بود. چون ما از یه  deterministic functionدیگه به نام    () GetRoot استفاده کردیم. حالا اگر برین روی جدولتون یه راست کلیک کنین و ردیف های (Row)جدولتون رو ببینین یه همچین شکلی رو می بینین:

شکل مربوط به افزوده شدن نود ریشه به جدول

5.حالا می خواییم بچه های این پدر گرامی رو بهش اضافه کنیم برای این کار از یه  deterministic functionدیگه به نام         ()GetDescendants استفاده می کنیم. خوب مجددا یه New Query باز کنین و کد زیر رو بنویسین و اجرا کنین:

First we should declare some variables ---

Declare @ManagerNode hierarchyid

Declare @Level hierarchyid

---

Select @ManagerNode=node from Mujudats where mujud_id = 5000

--GetDescendant will now return the first child "/1"

--since there are no other children defined

('Insert Into Mujudats values (@ManagerNode.GetDescendant(null,null),5001,'jundaran

با اجرای این کد فرزند راست موجودات بهش اضافه می شه. می تونین توی سطرها هم ببینین که اضافه شده. شکل زیر:

شکل افزوده شدن فرزند راست به جدول

6. حالا اگر بخواهیم فرزند چپ رو به Mujudat  اضافه کنیم باید کد زیر رو توی یه New Query  بنویسین و اجرا کنین. توی کد یه توضیحاتی رو کامنت کردم بهش دقت کنین:

now: if we are passing (jundaran,Null) to GetDesecndant() this ------

will give us the node value of next child after jundaran------

but if we are passing (Null,Jundaran), this function would return------

the node value of the child previous to Jundaran------

actually we insert a child before jundaran------

Declare @managerNode hierarchyid

Declare @Level hierarchyid

select @managerNode=node from Mujudats where Mujud_id=5000

Select @Level=node from Mujudats where Mujud_id =5001

('insert into Mujudats Values(@managerNode.GetDescendant(@Level,null),5002,'Bijanha)

دیگه از کدش مشخصه دیگه ببینین می گه برو به ریشه (@ManagerNode که آی دی ریشه رو بهش دادیم) در سطح @Level که بهش سطح فرزند قبلی رو دادیم که سطحش 1 بود، فرزند جدید رو با آی دی 5002 و نام  Bijanha اضافه کن. حله؟!

دوباره برین ردیف اضافه شده به جدول رو ببینین. می بینین سطح ها یکی شدن. نحوه ی نمایش رو هم دقت کنین:

شکل افزوده شدن فرزند چپ به جدول

6. قبل از اینکه بریم سراغ فرزندهای بعدی کد زیر رو توی یه صفحه ی جدید بنویسین و اجرا کنین: این کد اطلاعات ستون هایرآکی آی دی  مون (hierarchyid)رو به صورت رشته و باینری نشون می ده:

,select node.ToString() AS NodeAsString

,node as NodeAsBinary

,node.GetLevel() AS Level

,Mujud_id

Mujud_name

from Mujudats

به صورت شکل زیر می تونین اجراش رو ببینین:

شکل جدول در تبدیل به رشته و ...

7. و اما بقیه فرزندان پست بعدی ان شاا...

فایل کدهای دیتابیس راست کلیک بعد Save Target as... لطفا. :-)

تا اینجاش رو کار کنین اگر مشکلی بود در خدمتم.

استفاده از مطالب این وبلاگ با ذکر منبع مجاز است، لطفا!!

ایده هات مثل یه پَر که آرووم فرود می آد...

می تونی مفهوم و زیبایی تمام زندگی رو ، دنیا رو جمع کنی توی فقط یه نقطه که در بی نهایت غرقه... محیطِ مجتمع ِ "ویژوال استادیو دات نت" ، یه دنیاست مثل همین دنیا، لایه لایه، صفحه صفحه، دنیا دنیا...می شه توش سفر کرد و زندگی ساخت...دنیایی که قدرتت اونو ساخته، می سازه...مثل ِ یک محیط بازی، جایی برای یادگرفتن و تمرین زندگیه... مثل تمام موقعیت ها ولحظه های زندگی...

---------------------------

tabasom.world@gmail.com 

توجه:

بخش نظرات پس از 3 روز از ارسال پست بسته خواهد شد. برای ارسال سوال یا نظرات از بخش تماس سایت اقدام نمایید. در صورت نیاز از طریق ایمیل پاسخ داده خواهد شد.

پست های قبلی