PDA

View Full Version : مشکل با دیتاست ساخته شده توسط Code Generator های ویژوال استودیو



csharpcollegian
سه شنبه 14 دی 1395, 18:59 عصر
سلام دوستان وقتتون به خیر
دوستان من در برنامه های گذشتم وقتی میخواستم اطلاعاتی رو از بانک بخونم و به لایه های بالاتر برنامم انتقال بدم، بعد از اینکه اطلاعات مورد نظرم رو از بانک میخوندم، DataTable حاوی اطلاعات رو در همون لایه Data Access در یک <>List کپی کرده و به لایه ی بالاتر منتقل می کردم. برای مثال با فرض اینکه قصد داریم اطلاعات جدول Person رو از بانک بخونیم و PersonEntity هم شی متناظر جدول در برناممون هست :

DataTable dtPerson = new DataTable();
.
.
.
dataAdapter.Fill(dtPerson);
List<PersonEntity> personList = new List<PersonEntity>();
foreach (DataRow person in dtPerson.Rows)
{
PersonEntity personObj = new PersonEntity();
personObj.ID = (int)person["ID"];
personObj.Name = (string)person["Name"];
personObj.Phone = (string)person["Phone"];
personList.Add(personObj);
}
return personList;

اما چند وقت پیش توو این سایت (http://www.matlabsite.com/5966/three-layer-architecture-in-c-sharp.html) دیدم که با اضافه کردن DataSet بانک اطلاعاتی به برنامه و کمک گرفتن از شی های متناظر جداول بانک که توسط خود ویژوال طراحی میشن و ترکیب اون با روش بالا میشه راحت تر کد زد. برای مثال با فرض اینکه نام DataSet بانک اطلاعاتیمون dsPhonebook باشه :


var dtPerson = new dsPhonebook.PersonDataTable();
.
.
.
dataAdapter.Fill(dtPerson);
List<PersonEntity> personList = new List<PersonEntity>();
foreach (var person in dtPersons)
{
PersonEntity personObj = new PersonEntity();
personObj.ID = person.ID;
personObj.Name = person.Name;
personObj.Phone = person.Phone;
personList.Add(personObj);
}
return personList;

خب حالا اگه یکی از فیلدهای جدولمون در بانک اطلاعاتی مقدار Null داشته باشه (مثلا فیلد Phone). در روش اول برای جلوگیری از بروز مشکل از یه if قبل از کپی فیلد Phone استفاده می کردم و مشکل حل میشد :



if (person["Phone"] != DBNull.Value)
personObj.Phone = (string)person["Phone"];


اما در روش دوم امکان این کار وجود نداره. چون get در پراپرتی Phone طوری تنظیم شده که اگر مقدار Null بود استثنا تولید کنه و if بالا قابل پیاده سازی نیست :

public string Phone {
get {
try {
return ((string)(this[this.tabletblUser.PhoneColumn]));
}
catch (global::System.InvalidCastException e) {
throw new global::System.Data.StrongTypingException("The value for column \'Phone\' in table \'tblUser\' is DBNull.", e);
}
}
set {
this[this.tabletblUser.PhoneColumn] = value;
}
}

دوستان و اساتید محترم نظرشون چیه ؟
ببخشید که طولانی شد
ممنونم

ژیار رحیمی
چهارشنبه 15 دی 1395, 02:26 صبح
خب در قسمت get پراپرتی try و catch رو بردار و بصورت زیر بنویس

get {
var tmp=(string)(this[this.tabletblUser.PhoneColumn]);
if(tmp!=null)return tmp;
return string.Empty;
}