PDA

View Full Version : استانداردی برای کار با بانک های اطلاعاتی



Milad Mohseny
دوشنبه 15 خرداد 1385, 03:08 صبح
سلام خدمت دوستان واساتید محترم .
من میخواستم از مدیر بخش و دیگر اساتید محترم کسب اجازه کنم که اگر اجازه میدهند در این تاپیک یکسری کد هایی رو برای کار با بانک های اطلاعاتی نظیر برقراری ارتباط ، حذف و اضافه کردن اطلاعات و .... قرار دهم که صد البته با کمک دوستان واساتید آن ها را تصحیح کنیم و به عنوان استاندارد از آنها استفاده کنیم . یعنی با مطالعه این تاپیک کسی مشکلی با کار کردن و برقراری ارتباط با بانک های اطلاعاتی نداشته باشد و دیگر تاپیک هایی با نام چطوری اطلاعات را داخل بانک قرار دهم و ... از سوی کاربران جدید و غیره ایجاد نگردد . اگر هم نظر مدیر محترم بخش منفی است که من خودم این تاپیک رو حذف میکنم .

sianooshonline
دوشنبه 15 خرداد 1385, 16:44 عصر
سلام،میشه از DataAccessLayer که مال خود مایکروسافته استفاده کرد و توسعش داد.
اگه خواستید بگید لینکش رو بگذارم.
موفق باشید

Milad Mohseny
دوشنبه 15 خرداد 1385, 22:28 عصر
اولین کار
اتصال به بانک اطلاعاتی و بستن بانک .


private bool connect2Db(SqlConnection Ado_Bank,string cntString)
{
try
{
Ado_Bank.ConnectionString = cntString;
Ado_Bank.Open();
return true;
}
catch(SqlException errParam)
{
closeCnt(Ado_Bank);
MessageBox.Show("خطا در اتصال به بانک اطلاعاتی" + "\n" + errParam.Number.ToString());
errParam = null;
return false;
}
}
private bool closeCnt(SqlConnection Ado_Bank)
{
try
{
Ado_Bank.Close();
Ado_Bank.Dispose();
Ado_Bank = null;
return true;
}
catch(SqlException errParam)
{
MessageBox.Show("خطا در بستن بانک اطلاعاتی" + "\n" + errParam.Number.ToString());
errParam = null;
return false;
}
}


نحوه فراخوانی
برای مثال :


private void button1_Click(object sender, EventArgs e)
{
SqlConnection Ado_Cnt=new SqlConnection();
if (connect2Db(Ado_Cnt, "server=localhost;database=Northwind;uid=sa;pwd=s;c onnection timeout=20") == false)
Application.Exit();
else
MessageBox.Show("Connect to database .");

if (closeCnt(Ado_Cnt) == true)
MessageBox.Show("Close databae .");
}

دوستان اگر اشکال یا اطلاح یا نظر بهتری فقط در این زمینه دارید ارایه کنید .

iekrang
سه شنبه 16 خرداد 1385, 20:22 عصر
کار خیلی جالبی میکنید.
فقط یه نکته ای:آیا توی #c احتیاجی به Dispose هست؟چون یکی از قابیتهایی که من شنیده بودم قضیه garbage collection بود که از جاوا گرفته شده.
حتماً ادامه بدید و موفق باشید دوست عزیز.

Milad Mohseny
چهارشنبه 17 خرداد 1385, 00:47 صبح
سلام دوست من ممنون که تاپیک رو نگاه کردی . این هم در مورد Dispose

Note
Always call Dispose before you release your last reference to the Component. Otherwise, the resources it is using will not be freed until the garbage collector calls the Component object's Finalize method.



مرجع MSDN به آدرس

http://windowssdk.msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref7/html/M_System_ComponentModel_Component_Dispose.asp

اگر دوستان نظری یا راه حل بهتری ندارند برم سراغ قسمت بعدی ؟

iekrang
چهارشنبه 17 خرداد 1385, 14:05 عصر
ممنون از توضیحتون.
یه نکته ای هم هست من به نظرم اومد شاید بدرد بقیه دوستان بخوره: این نوع کد نوشتن شما،باعث میشه خیلی راحت بشه توی کل برنامه دست برد.منظورم اینه فرض کنید بخواهیم دیتابیس برنامه رو از sql تغییر بدیم.در این صورت لازم نیست تو کل برنامه دست ببریم و فقط همان کلاسی که توی برنامه ها ازش استفاده میکنیم رو تغییر میدیم.
روش خیلی خوبیه.بیصبرانه منتظر ادامه ماجرا هستیم.

Milad Mohseny
چهارشنبه 17 خرداد 1385, 20:56 عصر
سلام دوست من iekrang ممنون از اینکه این تاپیک رو نگاه میکنی .
به این امید که بازدید کنندگان این بحث بیشتر از یک نفر شود .

Connection Pooling
یک مطلبی رو در مورد اتصال به بانک اطلاعاتی دیدم که فکر کنم برای دوستانم هم جالب باشه
امروز میخواهم مطلب جالب رو در مورد مخزن اتصال یا Connection Pooling بگم .
باز کردن و بستن بانک اطلاعاتی فرآیندی نسبتاً زمانبر است به همین دلیل ADO.NET به طور خود کار اتصالات به پایگاه داده را در یک مخزن ذخیره میکند این مخزن بهبود کارآیی قابل توجهی را ارایه میکند بدین صورت که وقتی اتصالی را میبندیم آن اتصال واقعاً بسته نمیشود در عوض اتصال شما به عنوان نامستعمل علامت خورده و و در مخزن ذخیره میشود و مجدداً آماده استفاده میشود . اگر چنانچه جزعیات مشابهی را در رشته اتصال اعمال کنید اتصال از مخزن بازیابی و برگردانده میشود و آنگاه از از اتصال مشابهی برای دستیابی به پایگاه داده استفاده میکند.
هنگام استفاده از یک شی SQL Connection میتوانید حداکثر تعداد اتصالات مجاز در مخزن را با Max Pool size در رشته اتصال خود تعیین کنید و پیش فرض آن 100 میباشد .
و همچنین میتوانید حداقل تعداد اتصالات در مخزن را با تعیین min pool size مشخص کنید که پیش فرض آن صفر است
البته لازم به ذکر است که اگر حداکثر تعداد مخضن را مثلاً 10 تعیین کنید و الان هم 10 اتصال باز داشته باشید اگر بخواهید اتصال یازدهم را هم باز کنید درخواست شما منتظر میماند تا یک SQLConnection بسته شود و آن شی برای استفاده برگردانده شود.
البته بازهم این نکته را باید توجه کنیم که اگر درخواست شما از تعداد ثانیه در خصوصیت ConnectionTimeOut طولانی تر شود استثنایی رخ میدهد .

برای مثال
ویژوال استدیو را باز کرده و یک پروژه Console Application را آغاز کرده و سپس کد زیر را کپی کنید




using System.Data.SqlClient;


static void Main(string[] args)
{
SqlConnection mySqlConnection = new SqlConnection("server=localhost;database=Northwind;"+
"uid=sa;pwd=sa;max pool size=10;min pool size=5");
for (int count = 1; count <= 10; count++)
{
Console.WriteLine("count = " + count);
DateTime start = DateTime.Now;
mySqlConnection.Open();
TimeSpan timeTaken = DateTime.Now - start;
Console.WriteLine("Milliseconds = "+timeTaken.Milliseconds);
Console.WriteLine("mySqlConnection.State = "+mySqlConnection.State);
mySqlConnection.Close();
}
Console.ReadLine();
}


البته به این دلیل از تابع نوشته شده در تاپیک قبل برای باز و بسته کردن بانک استفاده نکردم چون میخواستم قبل و بعد از باز کردن بانک زمان اتصال را محاسبه کنم.
منبع
Mastring C# Database Programming جیسن پرایس

once4ever
چهارشنبه 17 خرداد 1385, 21:07 عصر
کار جالب و مفیدی انجام میدید.
(حتما نگاه کاملتری میکنم تا بتونم همراه خوبی باشم;) )
موفق باشید. منتظرم

nasimnastaran
پنج شنبه 18 خرداد 1385, 15:09 عصر
کار بسیار جالبی است . :تشویق:
اما در ارتباط با نحوه اتصال به دیتا بیس ( قسمت اول ) من فکر کنم راه فوق کمی طولانی است .
برای این کار یک مثالی که از MSDN پیدا کردم ، جالب است .
فرض می کنیم فرم اول فرمی است دیتا ها در آن قرار می گیرند و فرم دوم برای نشان دادن پیام به کاربر . در فرم دوم یک Label که خاصیت dock آن به صورت Fill است قرار می دهیم و تابعی بدین صورت در فرم دوم می نویسیم :


public void Show(string Message)
{
label1.Text = Message;
this.Show();
System.Windows.Forms.Application.DoEvents();
}

و در رویداد فرم لود فرم اول یا هر فرم تاییدیه ( ورود به فرم دیگر ) به صورت ذیل اتصال به دیتا بیس را چک می کنیم
private void frmMain_Load(object sender, System.EventArgs e)
{
Form2 frmStatusMessage =new Form2();

frmStatusMessage.Show("Connecting to SQL Server");
bool IsConnecting = true;

while (IsConnecting)
{

try
{
اتصال به دیتا ....
IsConnecting = false;
}
catch(Exception exc)
{
frmStatusMessage.Close();
MessageBox.Show("شما باید برای اجرای این برنامه به اس کیو ال متصل باشید");
Application.Exit();
}
}

Milad Mohseny
پنج شنبه 18 خرداد 1385, 17:53 عصر
سلام دوست عزیز nasimnastaran
ممنون که این تاپیک رو نگاه کردی

اما در ارتباط با نحوه اتصال به دیتا بیس ( قسمت اول ) من فکر کنم راه فوق کمی طولانی است .
برای این کار یک مثالی که از MSDN پیدا کردم ، جالب است .

دوست من ، من روش اتصال به بانک رو گفتم ولی کدی که شما گذاشته اید چک میکند که آیا ارتباط برقرار است یانه. شاید هم من منظور شما رو درست متوجه نشده باشم . لطفاً توضیح دهید .

nasimnastaran
جمعه 19 خرداد 1385, 00:32 صبح
بله ، این کد بررسی می کند که آیا اصلا می توان به SQL متصل شد یا نه ؟

Milad Mohseny
جمعه 19 خرداد 1385, 01:11 صبح
بله ، این کد بررسی می کند که آیا اصلا می توان به SQL متصل شد یا نه ؟

سلام دوست من . ممنون از اینکه کد رو قرار دادی
ولی فعلاً بحث سر روش اتصاله . به مطلبی هم که شما فرمودید در قسمت های بعدی بحث میکنیم . ممنون

iekrang
جمعه 19 خرداد 1385, 01:27 صبح
یه سوال در مورد connecrion pooling:
آیا فقط برای SQL Connection هاست یا برای بقیه Connection ها هم جواب میده.چون من هر مثالی از این قضیه دیدم در مورد sql بوده!
ممنون میشم اگر راهنماییم کنید.

Milad Mohseny
جمعه 19 خرداد 1385, 01:48 صبح
سلام دوست عزیزم
کلاً 3 کلاس Connection وجود دارد
SQL Connection و OleDbConnection و OdbcConnection
SQL Connection رو که میدونید
شی از کلاس OledbConnection برای هر پایگاه داده ای که از OLE DB پشتیبانی کند مثل Oracle یا Access
و شی از کلاس OdbcConnection برای اتصال به هر پایگاه داده ای که از ODBC پشتیبانی کند .
بقیه کار هم خیلی باهم فرقی ندارد .

Milad Mohseny
شنبه 20 خرداد 1385, 20:35 عصر
سلام کسی مطلبی یا پیشنهادی نداره ؟
برم سراغ قسمت بعد .
نبود ؟؟؟؟؟؟؟؟

Milad Mohseny
دوشنبه 22 خرداد 1385, 23:04 عصر
چرا هیچ کس فعالیتی نمیکنه ؟

nasimnastaran
چهارشنبه 24 خرداد 1385, 16:44 عصر
شما مطالبتان را ادامه دهید ، قطعا دیگران هم استفاده خواهند کرد . این سایت ، سایت آموزشی می باشد !

rabinhood_tehran
پنج شنبه 25 خرداد 1385, 10:00 صبح
با سلام به دوستان گرامی
هدف و نکاتی که شما در ذهن دارید و بواسطه اون تصمیم گرفتید این کار رو انجام بدید بسشار عالی است. (1000 تا)
قطعا هدف شما ایجاد کدی است که 1 - خوانا باشد 2 - قسمتهای تکراری را یکبار بنویسد و در مکاهنهای مختلف یک یا چند پروژه استفاده کنید 3- هر کد فقط یکبار نوشته شود و ...
سئوال : آیا کد نوشته شده برای باز کردن DB را میتوان در یک پروژه ASP.NET استفاده کرد؟!
جواب منفی است ! زیرا در این کد از َShow برای نشان دادن خطا استفاده شده است. که در وب قابل استفاده نیست. یا در کاربردی ممکن است شما نخواهید به کاربر پیغام خطا ارائه دهید ! و بدون اطلاع او به پایگاه دیگری وصل شوید !!

Milad Mohseny
پنج شنبه 25 خرداد 1385, 14:05 عصر
سئوال : آیا کد نوشته شده برای باز کردن DB را میتوان در یک پروژه ASP.NET استفاده کرد؟!

من این کد را در مبحث #C قرار دادم چون در این زبان فعالیت میکنم و اگر میخواستم کدی بنویسم که در همه زبان ها مثلا ASP و ... کار برد داشته باشه اون رو در مبحث #C قرار نمیدادم ولی با چند اصلاح جزعی میتوان آن را برای ASP هم استفاده کرد .
خیلی ممنون که این تاپیک رو خواندی و پاسخ دادی .

mjkhosravi
جمعه 26 خرداد 1385, 04:31 صبح
گفتید که در ASp هم میشه و من درتالارasp رو گشتم ولی چیزی پیدا نکردم و مشکل من هم اینه که به دستور دومم گیر میده :

sqldataConnection.ConnectionString = "Data Source=MOHAMMAD;Initial ";Catalog=j3;Integrated Security=True
;()sqldataConnection.open

و چیزی که میگه اینه:

Login failed for user 'MOHAMMAD\ASPNET'

در صورتیکهوقتی با یک sqldatasource میزنم وtestconnection رو میزنم درست وصل میشه،میخواستم بدونم چه جوری این مشکل رو میشه حل کرد

negar84
چهارشنبه 29 شهریور 1385, 22:01 عصر
کار جالبیه...
چرا کارتون رو ادامه ندادین ؟

mahan8204
شنبه 08 مهر 1385, 07:59 صبح
سلام

خیلی جالب بود . چرا تموم شد .

اگه امکان داره ادامه بدین .
ممنون میشیم.

مهدی رحیم زاده
شنبه 08 مهر 1385, 08:52 صبح
ببین دوست عزیز
شما در مورد اتصال با بانک هر سئوالی که داری بزار مطمئن باش که حتما جواب میگیری ....

مهدی رحیم زاده
یک شنبه 09 مهر 1385, 18:29 عصر
دوست عزیز اگر سئوالی داری بپرس حتما اگر بتونم جواب میدم ( مشکلت رو بگو )

ar_monti@
جمعه 19 آبان 1385, 09:41 صبح
سلام
لطفآ در ارتباط با اتصال به ORACLE هم توضیح بدین
ممنون