PDA

View Full Version : not all code paths return a value



shima2006
جمعه 19 آذر 1389, 14:24 عصر
سلام دوستان
من کد زیر رو در کلاس BaseDAL نوشتم



publicobject ExecuteScaler(CommandType commandType, string commandText)
{
using (SqlConnection con = newSqlConnection(cnnStr))
{
SqlCommand cmd = newSqlCommand();
cmd.Connection = con;
cmd.CommandType = commandType;
cmd.CommandText = commandText;
object retVal =cmd.ExecuteScalar();
return retVal;
}
}

و در لایه DAL :


publicobject Find()
{
string str1 = "SELECT MAX(ID) + 1 AS AccountId FROM dbo.Accounts";
return ExecuteScaler(CommandType.Text ,str1);
}

در BOL هم اونو فراخوانی کردم :


public DAL.AccountsDB SanadData = new DAL.AccountsDB();
publicobject Find()
{
SanadData.Find();
}

ولی با خطای زیر مواجه میشم :


not all code paths return a value

کسی از دوستان دلیل رو میدونه؟!

taghi.km
جمعه 19 آذر 1389, 15:07 عصر
تو این قسمتpublicobject ExecuteScaler(CommandType commandType, string commandText){using (SqlConnection con = newSqlConnection(cnnStr)){SqlCommand cmd = newSqlCommand();cmd.Connection = con;cmd.CommandType = commandType;cmd.CommandText = commandText;object retVal =cmd.ExecuteScalar();return retVal;}}احتمال اینکه خروجی نداشته باشی هست بهتره که متغییر یازگشتی رو اول تعریف کنی بعد یه مقدار اولیه به اون بدی و قبا از اینکه تابع تموم بشه از return استفاده کنیبه این شکلpublicobject ExecuteScaler(CommandType commandType, string commandText){object retVal = 0;using (SqlConnection con = newSqlConnection(cnnStr)){SqlCommand cmd = newSqlCommand();cmd.Connection = con;cmd.CommandType = commandType;cmd.CommandText = commandText;retVal =cmd.ExecuteScalar();}return retVal;}در کل بهتره تو این فانکشن به جای object از integer استفاده کنی

shima2006
جمعه 19 آذر 1389, 23:36 عصر
دوست من همه این کارها رو انجام دادم ولی درست نشد
دوستان نظر دیگه ای ندارین؟:ناراحت:

ahrimaneahurai
جمعه 19 آذر 1389, 23:48 عصر
شما وقتی از using استفاده میکنی بعد از اتمامش dispose میشه پس اگه توی using چیزی برنگرده خود تابع هم چیزی برنمیگردونه یا از using استفاده نکنید یا اگه میکنه بعد از اتمام using باز هم مقدار برگردونید

shima2006
شنبه 20 آذر 1389, 01:18 صبح
شما وقتی از using استفاده میکنی بعد از اتمامش dispose میشه پس اگه توی using چیزی برنگرده خود تابع هم چیزی برنمیگردونه یا از using استفاده نکنید یا اگه میکنه بعد از اتمام using باز هم مقدار برگردونید

متشکرم دوست من ، ولی من اصلا متوجه نمیشم این چه ربطی به USing داره ؟!!
اگه لطف کنید و یک کم بیشتر توضیح بدید واقعا ممنون میشم...

JaguarXF
شنبه 20 آذر 1389, 04:57 صبح
bad design

retVal رو خارج از using تعریف کن
داخل using مقدار دهی کن
خارج از using مقدارش رو return کن.
فکری هم برای هندل کردن Null Exception احتمالی بکن

امثال این مختص سی شارپ نیست . با هر زبون دیگری هم میبود باید کار مشابه همین انجام داد.

mmd2009
شنبه 20 آذر 1389, 07:46 صبح
با سلام

در خط :



publicobject Find()
{
SanadData.Find();
}


باید متد های غیر void رو مقدار بازگشی بهش داد. الان شما تو این متد هیچی رو بازگشت نمیدید.

یا اینکه از نوع void تعرییفش کنید یا سرو صورتی به کدتون بدید.