اشتباهات رایج برنامه نویسی در شیرپوینت – قسمت دوم

در مقاله قبلی ۵ مورد از اشتباهات رایج برنامه نویسی در شیرپوینت مطرح شد و در این مقاله قصد دارم به چند مورد دیگر از اشتباهات رایج برنامه نویسی در شیرپوینت بپردازم .

Null بودن مقادیر

حتما برای شما زیاد پیش آمده که بخواهید مقادیر یک آیتم از لیست را بخوانید و مورد استفاده قرار دهید ، اما موردی که همیشه باید به آن توجه کنید این است که زمانی که کاربر در هنگام وارد کردن اطلاعات ستونی را خالی بگذارد مقدار Null  در آن ستون ذخیره میشود و اگر شما تلاش کنید تا به مقدار آن ستون دسترسی پیدا کنید با خطا مواجه خواهید شد . در هنگام کار با آیتم ها برای دریافت مقادیر ذخیره شده بهتر یا از Try ، Catch به صورت زیر استفاده کنید :

String FullName = String.Empty;

SPList ContactList = web.Lists["Contacts"];

SPListItem item = ContactList.GetItemById(1);

try

{

    FullName = item["FullName"];

}

catch(Exception error)

{

    SPUtility.TransferToErrorPage(error.Message);

}

و یا قبل از مقدار دهی Null بود را چک کنید :

if(item["FullName"]!=null)

{

    FullName=Convert.ToString(item["FullName"]);

}

همچنین زمانی که قصد مقدار دهی یک ستون از آیتمی را دارید نیز همیشه از try ، Catch استفاده کنید ، زیرا ممکن است نوع ستون با مقداری که وارد میکنید متفاوت باشد و باعث بروز خطا شود و یا نام ستون را اشتباه وارد کرده باشید و یا ستونی که قصد مقدار دهی دارید اصلا وجود نداشته باشد.

SPList ContactList = web.Lists["Contacts"];

SPListItem item = ContactList.Items.Add();

try

{

    item["Title"] = "Ahmadi";

}

catch { }

try

{

    item["Name"] = "Ramin";

}

catch { }

try

{

    item["FullName"] = "Ramin Ahmadi";

}

catch { }

Null بودن لیست ها

اگر در شیرپوینت ۲۰۰۷ بخواهید به لیستی دسترسی پیدا کنید که وجود نداشته باشد با پیغام خطا مواجه میشوید و در ضمن نمیتوانید Null بودن ( وجود لیست ) را نیز بررسی کنید مگر اینکه ازtry ، catch استفاده کنید ، در شیرپوینت ۲۰۱۰ متدی به آبجکت SPList   با عنوان TryGetList  اضافه گردیده که با استفاده از آن میتوانید از وجود یک لیست با خبر شوید :

SPList ContactList = web.Lists.TryGetList("Contacts");

if (ContactList != null)

{

    // do something

}

 همانطور که مشاهده میکنید این متد شامل یک پارامتر رشته ای بوده که نام لیست را از شما دریافت میکند و سپس شما به راحتی میتوانید وجود یک لیست را بررسی و عملیات لازم را انجام دهید .

استفاده از نام های فارسی برای ستون ها

هنگام برنامه نویسی لیست ها همیشه سعی کنید برای عنوان ستون ها  از نام های لاتین استفاده کنید تا مشکلی در دسترسی به ستون ها نداشته باشید زیرا زمانی که از نام های فارسی استفاده کنید در دیتابیس با فرمت خاصی ذخیره میشود که دسترسی را برای شما سخت خواهد کرد ، هنگامی که ستونی ایجاد میشود Static Name آن با عنوانی که وارد کردید ذخیره میشود و پس از آن با هر بار تغییر عنوان ، Display Name  تغییر کرده و Static Name به همان شکل باقی خواهد ماند که میتوانید از آن در کدنویسی و دسترسی به ستون استفاده کنید .

list.Fields.Add("ProductName", SPFieldType.Text, true);

SPField field = list.Fields["ProductName"];

field.Title = "نام محصول";

field.Update();

string productName = list.GetItemById(1)["ProductName"].ToString();

                           

استفاده نادرست از Disposal Object

یکی دیگر از اشتباهات رایج در بین برنامه نویسان استفاده از آبجکت های Disposal به عنوان خروجی توابع میباشد و یا Dispose کردن این آبجکت ها قبل از استفاده ! به مثال زیر توجه کنید :

public static SPWeb GetSPWeb(string url)

{

using (var site = new SPSite(url))

{

    using (SPWeb web = site.OpenWeb())

    {

        return web;

    }

}

}

در این تابع آبجکت SPWeb قبل از بازگشت به کد اصلی برنامه Dispose شده است و برنامه را با خطا مواجه خواهد کرد .

استفاده از ViewFields در کوئری

همانطور که قبلا هم طی مقالاتی خدمت شما دوستان عزیز مطالبی رو در مورد بهبود سرعت عملیات در شیرپوینت اشاره کردم بودم بهتر است برای دریافت داده ها از لیست های شیرپوینتی از ViewFields و RowLimit استفاده کنید ، اما مشکلی که ممکن در استفاده از ViewFields برای شما به وجود آید دسترسی به داده هایی است که در کالکشن داده های کوئری وجود ندارند ! به طور مثال به کد زیر توجه کنید :

SPList UsersList = web.Lists["لیست کاربران"];

SPQuery search = new SPQuery();

search.Query = @"<Where><Eq><FieldRef Name='Account' LookupId='TRUE'/><Value Type='Integer'>2</Value></Eq></Where>";

search.RowLimit = 2;

search.ViewFields = "<FieldRef Name='Title'/><FieldRef Name='ID'/>";

SPListItemCollection result = UsersList.GetItems(search);

if (result.Count > 0)

{

string FullName = result[0]["FullName"].ToString();

}

با اجرای این کد با خطا مواجه خواهید شد زیرا ستون FullName  را در ViewFields قرار نداده اید ! اما نحوه صحیح استفاده از این کد :

SPList UsersList = web.Lists["لیست کاربران"];

SPQuery search = new SPQuery();

search.Query = @"<Where><Eq><FieldRef Name='Account' LookupId='TRUE'/><Value Type='Integer'>2</Value></Eq></Where>";

search.RowLimit = 2;

search.ViewFields = "<FieldRef Name='FullName'/><FieldRef Name='ID'/>";

SPListItemCollection result = UsersList.GetItems(search);

if (result.Count > 0)

{

string FullName = result[0]["FullName"].ToString();

}

در ضمن به خاطر داشته باشید که ستونهایی که قصد دارید آنها را در قسمت شرط جستجو استفاده کنید لازم نیست در ViewFields آورده شوند ، در مثال بالا ما Account  را در قسمت ViewFields وارد نکردیم و این مشکلی برای جستجو ایجاد نخواهد کرد .

موفق و پیروز باشید .

پاسخ دهید