PDA

View Full Version : سوال: جلوگيري از وصل شدن زياد به بانک



bftarane
چهارشنبه 10 آبان 1391, 15:41 عصر
سلام.
فرض کنيد من اين دو تا متد رو دارم

public SqlDataReader GetAllRoles()
{
using (SqlConnection con = new SqlConnection(CS))
{
SqlCommand cmd = new SqlCommand("GetAllRoles", con);
cmd.CommandType = CommandType.StoredProcedure;
con.Open();
SqlDataReader dr = cmd.ExecuteReader();
chkl_roles.DataSource = dr;
chkl_roles.DataTextField = "RoleName";
chkl_roles.DataBind();
con.Close();
return dr;
}
}
public SqlDataReader GetAllUsers()
{
using (SqlConnection con = new SqlConnection(CS))
{
SqlCommand cmd = new SqlCommand("GetAllUsers", con);
cmd.CommandType = CommandType.StoredProcedure;
con.Open();
SqlDataReader dr = cmd.ExecuteReader();
grd_users.DataSource = dr;
grd_users.DataBind();
con.Close();
return dr;
}
}
که در رويداد لود صفحه فراخواني ميشن به صورت زير

protected void Page_Load(object sender, EventArgs e)
{

if (!IsPostBack)
{
GetAllRoles();
GetAllUsers();
}

}
مي بينيد که در اين دو متد کانکشن داره باز و بسته ميشه. که اين جور که متوجه شدم اين زياد باز و بسته شدن کانکشن
کار درستي نيست
من چه جوري بايد اين کدها رو تغيير بدم تا روش کدنويسيم درست باشه و مشکل زا نباشه؟:متفکر:

ممنون ميشم جوابم رو بدين:لبخندساده:

r_s1389@yahoo.com
چهارشنبه 10 آبان 1391, 16:08 عصر
سلام
شما میتونید یک کلاس تعریف کنید برای هر یک از 4 عمل اصلیتون به این شکل
http://uplod.ir/bzyj42mb2g57/DBConnection.cs.htm
و بعد هر جا که خواستین برنامه تون را اجرا کنید فقط کوئری را به برنامه بفرستید

مهدی هادیان2
چهارشنبه 10 آبان 1391, 16:32 عصر
بسم الله الرحمن الرحيم با سلام به نظر بنده کار درستي ست که در هر متدي که با بانک سروکار داره يک بار اتصال رو باز, عمل موردنظر انجام شود و سپس بسته شود. اساتيد بهتر ميتونن نظر کارشناسي شون رو اعلام کنند. موفق باشيد

r_s1389@yahoo.com
چهارشنبه 10 آبان 1391, 16:51 عصر
نه من فکر میکنم ایشون گفتنند که فط یک بار این کار رو انجام بدیم ولی هر چندتا کوئری خواستیم بتونیم اجرا کنیم

bftarane
چهارشنبه 10 آبان 1391, 16:59 عصر
از شما تشکر مي کنم من فايل رو گرفتم منتها هنوز امتحان نکردم. اگه سوالي برام پيش اومد تا يک ساعت ديگه مي پرسم.

programerinfonet
چهارشنبه 10 آبان 1391, 18:08 عصر
اصلأ گذشته از همه ی اینا اگه خواستید زیاد دستکاریش نکنید یک بار تو رویداد فرم لود کانکشن رو باز و یک بار هم تو رویداد فرم کلوزینگ کانکشن رو ببندید

black_binary
چهارشنبه 10 آبان 1391, 18:35 عصر
سلام
من نمیدونم درست میگم یا نه ولی فکر میکنم راه پیشنهادی جناب programerinfonet (http://barnamenevis.org/member.php?173652-programerinfonet)
مورد تایید نباشد چون ایده طراحی data set این بوده که این کار انجام نشود.
با احترام فراوان خدمت programerinfonet (http://barnamenevis.org/member.php?173652-programerinfonet)

r_s1389@yahoo.com
چهارشنبه 10 آبان 1391, 19:19 عصر
سلام
من نمیدونم درست میگم یا نه ولی فکر میکنم راه پیشنهادی جناب programerinfonet (http://barnamenevis.org/member.php?173652-programerinfonet)
مورد تایید نباشد چون ایده طراحی data set این بوده که این کار انجام نشود.
با احترام فراوان خدمت programerinfonet (http://barnamenevis.org/member.php?173652-programerinfonet)
[/URL]
اولا من هم حرف این دوستمون رو قبول دارم
دوما سوال خانم [URL="http://barnamenevis.org/member.php?82506-bftarane"]bftarane (http://barnamenevis.org/member.php?173652-programerinfonet) این بود که در کل برنامه از open, close استفاده نکنیم

programerinfonet
چهارشنبه 10 آبان 1391, 19:31 عصر
خیلیی ممنون از دوستان عزیز
من چون تو پروژه هام از این روش استفاده می کردم و سرعت برنامم هم افت نمی کرد فکر می کردم راه درستی باش
در کل یکی از ضعف های برنامه نویسان مبتدی و حتی حرفه ای مشکل کار با دیتابیس می باشد
چه طوره که یک تایپک در مورد آموزش های جامع بانک های اطلاعاتی رو آغاز کنیم

FastCode
چهارشنبه 10 آبان 1391, 22:16 عصر
همین روش درسته.
اگر زیاد از connection تون استفاده کنید., با اجرای بیشتر از ۲۰۰۰ تا command ممکنه به خطای Connection Internal Error بخورید.
واقعاً از بدترین خطاهاست.

programerinfonet
چهارشنبه 10 آبان 1391, 23:09 عصر
من بررسی می کنم و با یکی از مدیران سایت هماهنگ می کنم و بخشی تحت عنوان کار با بانک های اطلاعاتی تو سی شارپ رو ایجاد می کنم

bftarane
چهارشنبه 10 آبان 1391, 23:43 عصر
بچه ها من asp.net کار مي کنم نه ويندوز اپليکشن.

متد GetAllRoles به شکل زير شد
و DALBase رو هم در لينک زير مي تونيد ببينيد.
http://how2learnasp.net/article.aspx?code=4ee587d9-b099-4905-93f6-5fb3fb0fb681
اونجا چند لايه کار کرده ولي من احتمالاً به علت کمبود وقت نتونم چند لايه کار کنم.
چون تسلط کافي بهش ندارم.

public SqlDataReader GetAllRoles()
{
DALBase MyDALBase = new DALBase();
SqlDataReader dr = MyDALBase.ExecuteReader(System.Data.CommandType.St oredProcedure, "GetAllRoles", new SqlParameter[]{
});
chkl_roles.DataSource = dr;
chkl_roles.DataTextField = "RoleName";
chkl_roles.DataBind();
return dr;
}
با فايلي که آقاي r_s1389 گذاشتن اين جرقه به ذهنم زد که مي تونم از اون کلاس که در اون مقاله استفاده شده بود بهره بگيرم.

آخه من مي خواستم حتماً از Stored Procedure استفاده کنم و مثلاً فرض کنيد دستور سلکت مون يه همچين چيزي بود اگه

selec * from tbl_users where Id=@Id
خوب در اين صورت مجبور به استفاده از پارامتر ميشدم يعني يه همچين کدي

cmd.addwithvalue("@Id",Id);

که با توجه به فايلي که آقاي r_s1389 گذاشته بودن نمي شد اين کار رو انجام داد يا حداقل من نتونستم.
در هر صورت من از روش ايشون خوشم اومد.

بازم اگه کدهاي بالا رو به نظرتون بهتر ميشه نوشت من مشتاق شنيدن هستم.


همین روش درسته.
منظورتون روش آقاي r_s1389 هستش؟

r_s1389@yahoo.com
پنج شنبه 11 آبان 1391, 10:04 صبح
شما در سایتتون میخوایین از Stored Procedure استفاده کنید که امنیت سایت بره بالا آره؟

bftarane
پنج شنبه 11 آبان 1391, 13:01 عصر
تا جايي که من مي دونم هم از نظر امنيت و هم از نظر سرعت Stored Procedure بهتره.
بچه ها يه سوال دارم. الآن من کدهاي باز و بسته شدن کانکشن رو در يک کلاس نوشتم. خوب حالا کلاسم رو در صفحه مورد نظرم New کردم و هر جا لازمه متدهاي اون کلاس فراخواني ميشن. حالا سوالم اينه که مگه با هر بار فراخواني دوباره کانکشن باز و بسته نميشه؟

اين رو يکي ميشه براي من توضيح بده.

گرچه حداقل جوري کدنويسي کمتر ميشه و هي کدهاي تکراري نوشته نميشه.

fan2005
پنج شنبه 11 آبان 1391, 15:59 عصر
به نظرم بهتره از microsoft dataaccess block استفاده کنید تا مدیریت لایه data access بهتر و آسونتر بشه.

r_s1389@yahoo.com
پنج شنبه 11 آبان 1391, 20:37 عصر
تا جايي که من مي دونم هم از نظر امنيت و هم از نظر سرعت Stored Procedure بهتره.
بچه ها يه سوال دارم. الآن من کدهاي باز و بسته شدن کانکشن رو در يک کلاس نوشتم. خوب حالا کلاسم رو در صفحه مورد نظرم New کردم و هر جا لازمه متدهاي اون کلاس فراخواني ميشن. حالا سوالم اينه که مگه با هر بار فراخواني دوباره کانکشن باز و بسته نميشه؟

اين رو يکي ميشه براي من توضيح بده.

گرچه حداقل جوري کدنويسي کمتر ميشه و هي کدهاي تکراري نوشته نميشه.
سلام
خوب اون سوالت رو که جواب دادی من که منظور شما رو نفهمیدم

bftarane
جمعه 12 آبان 1391, 00:24 صبح
همین روش درسته.
اگر زیاد از connection تون استفاده کنید., با اجرای بیشتر از ۲۰۰۰ تا command ممکنه به خطای Connection Internal Error بخورید.
واقعاً از بدترین خطاهاست.
ببينيد جمله بالا از نظر من اين معني رو ميده که وقتي از کلاس استفاده نکرده باشيم commandها بيشتر از زماني که استفاده کرديم اجرا مي شن.
خوب من مي گم از کلاس هم که استفاده کنيم مگه وقتي فراخواني صورت مي گيره اجرا نمي شن همون تعداد command؟
نمي گيرم قضيه رو. شايدم اونقدر سادس که نمي فهمم.

شما هم اگه متوجه منظورم نشديد اشکال نداره. خودتون رو اذيت نکنيد.

r_s1389@yahoo.com
یک شنبه 14 آبان 1391, 18:18 عصر
سلام
من این رو گذاشتم تا این رو هم بخونید شاید یه چیزهای اضافی دیگر هم یاد گرفتید
http://uplod.ir/indjqnuf2v89/Connection_Pooling.pdf.htm
موفق باشین