PDA

View Full Version : آیا استفاده از این متد ExecuteReader صحیح است؟



sarapepors
جمعه 13 آبان 1390, 21:55 عصر
سلام دوستان من در برنامه ام از یه کلاس پایه استفاده کردم و متد های executenonquery , exequtereader رو در اون پیاده سازی کردم البته این کار از سایت how to learn asp.net الگو گرفتم . در کلاس هایی دیگه ای هم که دارم از این متد ها استفاده میکنم اما گاهی برنامه ام یه خطای خاص میده که راجع به time out expiredمتن کامل خطا الان خاطرم نیست .کد این متد:


SqlConnection con = new SqlConnection(ConnectionString);
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandType = commandType;
cmd.CommandText = commandText;
cmd.Parameters.AddRange(commandParameters);
bool mustCloseConnection = false;
try
{
if (con.State != ConnectionState.Open)
{
mustCloseConnection = true;
con.Open();
}
else
{
mustCloseConnection = false;
}
SqlDataReader dataReader;
dataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection) ;
return dataReader;
}
catch
{
if (mustCloseConnection)
con.Close();
throw;
}


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


public bool Read()
{
bool result = false;
SqlDataReader dr = ExecuteReader(CommandType.StoredProcedure,
"ReadTableWithIntId", new SqlParameter[] { new SqlParameter("@Code", Code),
new SqlParameter("@tblName", "Shahr") });
if (dr.HasRows)
{
result = true;
while (dr.Read())
{
Nam = dr["Nam"].ToString();
}
}
return result;
}

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

moslem.hady
جمعه 13 آبان 1390, 22:28 عصر
متن کد هات درست نمیاد

sarapepors
جمعه 13 آبان 1390, 22:52 عصر
ویرایش کردم . اگه میشه کمک کنید . مرسی

fakhravari
شنبه 14 آبان 1390, 00:07 صبح
با سلام
بلوکها خوب نمایش داده نمی شود.
با توجه به سوال
کل باید از این متد استفاده شود

sarapepors
شنبه 14 آبان 1390, 09:37 صبح
سلام از اونجایی که نمی دونم چطور باید کدها رو بنویسم که خوب نمایش داده بشه یه فایل ضمیمه کردم و داخلش نمایش دادم که از چه متد های برای خوندن از پایگاه استفاده کردم البته اجرا نمیشه چون پایگاهش همراش نیست . متشکرم.

fakhravari
شنبه 14 آبان 1390, 12:03 عصر
با سلام من منظور شما رو نفهمیدم چند نمونه کد براتون میزارم
protected string SqlAdd = "INSERT INTO [Ziarat_Ashora] ([Z_inhafte], [Comennts], [Date], [Time]) VALUES (@Z_inhafte, @Comennts, @Date, @Time)";


{
try
{
SqlConnection con1 = new SqlConnection(ادرس کانکشن);
con1.Open();
SqlCommand cmd1 = new SqlCommand(SqlAdd, con1);
cmd1.CommandType = CommandType.Text;
cmd1.Parameters.Add("@Comennts", SqlDbType.NVarChar).Value = this.Comennts;
cmd1.Parameters.Add("@Date", SqlDbType.NVarChar).Value = this.Date;
cmd1.Parameters.Add("@Z_inhafte", SqlDbType.NVarChar).Value = this.Z_inhafte;
cmd1.Parameters.Add("@Time", SqlDbType.NVarChar).Value = this.Time;
cmd1.ExecuteNonQuery();
con1.Close();
this.lasteror = "اطلاعات ثبت شد";
}

catch
{
this.lasteror = "اشکال در ثبت اطلاعات";
}
}


_______________________________________________
protected string SqlOne = "SELECT * FROM [Ziarat_Ashora] Where ID=@ID";
public DataTable One_Z_ashora()
{
SqlConnection con = new SqlConnection(ConnectionString);
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandText = SqlOne;
cmd.Parameters.Add("@ID", SqlDbType.Int).Value = this.ID;
con.Open();

SqlDataAdapter da = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();

da.Fill(dt);
con.Close();

if (dt.Rows.Count > 0)
{
this.Date = dt.Rows[0]["Date"].ToString();
this.Comennts = dt.Rows[0]["Comennts"].ToString();
this.Z_inhafte = dt.Rows[0]["Z_inhafte"].ToString();
this.Time = dt.Rows[0]["Time"].ToString();

this.ID = Int32.Parse(dt.Rows[0]["ID"].ToString());
}
else
{
lasteror = "موردی یافت نشد";

}
return dt;
}

sarapepors
شنبه 14 آبان 1390, 15:36 عصر
با سلام من منظور شما رو نفهمیدم چند نمونه کد براتون میزارم
protected string SqlAdd = "INSERT INTO [Ziarat_Ashora] ([Z_inhafte], [Comennts], [Date], [Time]) VALUES (@Z_inhafte, @Comennts, @Date, @Time)";


{
try
{
SqlConnection con1 = new SqlConnection(ادرس کانکشن);
con1.Open();
SqlCommand cmd1 = new SqlCommand(SqlAdd, con1);
cmd1.CommandType = CommandType.Text;
cmd1.Parameters.Add("@Comennts", SqlDbType.NVarChar).Value = this.Comennts;
cmd1.Parameters.Add("@Date", SqlDbType.NVarChar).Value = this.Date;
cmd1.Parameters.Add("@Z_inhafte", SqlDbType.NVarChar).Value = this.Z_inhafte;
cmd1.Parameters.Add("@Time", SqlDbType.NVarChar).Value = this.Time;
cmd1.ExecuteNonQuery();
con1.Close();
this.lasteror = "اطلاعات ثبت شد";
}

catch
{
this.lasteror = "اشکال در ثبت اطلاعات";
}
}


_______________________________________________
protected string SqlOne = "SELECT * FROM [Ziarat_Ashora] Where ID=@ID";
public DataTable One_Z_ashora()
{
SqlConnection con = new SqlConnection(ConnectionString);
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandText = SqlOne;
cmd.Parameters.Add("@ID", SqlDbType.Int).Value = this.ID;
con.Open();

SqlDataAdapter da = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();

da.Fill(dt);
con.Close();

if (dt.Rows.Count > 0)
{
this.Date = dt.Rows[0]["Date"].ToString();
this.Comennts = dt.Rows[0]["Comennts"].ToString();
this.Z_inhafte = dt.Rows[0]["Z_inhafte"].ToString();
this.Time = dt.Rows[0]["Time"].ToString();

this.ID = Int32.Parse(dt.Rows[0]["ID"].ToString());
}
else
{
lasteror = "موردی یافت نشد";

}
return dt;
}

سلام . ببینید من با خواندن اطلاعات از پایگاه از طریق متدی که شما نوشتید مشکلی ندارم اما توی این برنامه ای که تازه نوشتم کمی از برنامه نویسی چند لایه الگو گرفتم البته من فقط کمی الگو گرفتم از این روش و کل برنامه ام رو چند لایه کار نکردم . فایلی که به عنوان ضمیمه گذاشتم از دو کلاس تشکیل شده یکی baseclass که کلاس پایه است و باقی کلاس ها از اون مشتق میشن و از متد ها و خاصیتهاش استفاده میکنن. یه کلاس دیگه هم که در این فایل اسمش رو class1 گذاشتم همون کلاس مشتق شده است ئر کلاس پایه متد executereader وجود داره و در class1 هم متد read() مشکلی که دارم هم ایمه که در متد executereaderکانکشن پس از باز شدن بسته نمیشه می خوام بدونم که این ایجاد مشکل میکنه یا نه؟ علت این که می پرسم هم اینه که متد executreader رو خودم ننوشتم از سایت howtolearnasp.net اقای دلشاد گرفتم.دوستان لطفا راهنمایی کنید. متشکرم . یه بار دیگه کدها رو میذارم امیدوارم نمایش داده بشه:


public SqlDataReader ExecuteReader(CommandType commandType, string commandText, SqlParameter[] commandParameters)
{
SqlConnection con = new SqlConnection(ConnectionString);
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandType = commandType;
cmd.CommandText = commandText;
cmd.Parameters.AddRange(commandParameters);
bool mustCloseConnection = false;
try
{
if (con.State != ConnectionState.Open)
{
mustCloseConnection = true;
con.Open();
}
else
{
mustCloseConnection = false;
}
SqlDataReader dataReader;
dataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection) ;
return dataReader;
}
catch
{
if (mustCloseConnection)
con.Close();
throw;
}
}




public bool Read()
{
bool result = false;
SqlDataReader dr = ExecuteReader(CommandType.StoredProcedure,
"ReadTableWithIntId", new SqlParameter[] { new SqlParameter("@Code", Code),
new SqlParameter("@tblName", "Shahr") });
if (dr.HasRows)
{
result = true;
while (dr.Read())
{
Nam = dr["Nam"].ToString();
}
}
return result;
}

hofa_7
یک شنبه 15 آبان 1390, 01:26 صبح
سلام
من هم چند وقت پیش با همین مشکل مواجه بودم ، سریع میرم سر اصل مشکل ، ببین دوست عزیز مشکل اصلی سر
CommandBehavior.CloseConnection هست ، این خاصیت متاسفانه نمیتونه کانکشن رو خیلی از مواقع ببنده و در نتیچه ConnectionPool پر می شه و خطا میگیری

باید از راههای دیگه استفاده کنی ، DataTable , DataView , DataSet , Linq یا GenericList ها ، شخصا پیشنهاد میکنم GenericList ها که با Linq قدرت فوق العاده ای دارن

Saman Hashemi
یک شنبه 15 آبان 1390, 08:54 صبح
برای دستورت TimeOut مشخص کن...!

cmd.CommandTimeout = 300;

sarapepors
یک شنبه 22 آبان 1390, 10:40 صبح
سلام . من از timeout هم استفاده کردم اما هیچ فایده ای نداره بعد از یه مدت خاص که یه صفحه بار گذاری میشه همین ارور time out expired رو میده . مجبور شدم همه برنامه ام رو تغییر بدم و از همون روشی که قبلا استفاده می کردم استفاده کنم (همون روشی که جناب fakhravari اشاره کردند.)

یاسر مددیان
یک شنبه 22 آبان 1390, 13:24 عصر
sqldatareader رو که تعریف کردی ابتدا close کن و دوباه dispose.

sdr.close()
sdr.dispose()

و می تونی cmd.CommandTimeout = 0 قرار بدی.