تنظیم ConnetctionString و ارتباط با بانک اطلاعاتی

در حالت کلی برای ارتباط با بانک اطلاعاتی و انجام دستورات مختلف بر روی بانک باید از شی های زیر استفاده کنید :

 

SQLConnection

وظیفه اصلی این کلاس ارتباط با بانک اطلاعاتی است . سازنده این کلاس یک رشته را به عنوان پارامتر میگیرد که رشته اتصال نام دارد . در رشته اتصال خاصیت های مختلفی قرار دارد که به عنوان مثال مسیر بانک اطلاعاتی ، سرور بانک اطلاعاتی ، نام کاربری و رمز عبور بانک اطلاعاتی در آن قرار می گیرد .

 

SQLCommand

دستورات مختلفی را بر روی بانک اطلاعاتی اجرا می کند . در بیشتر برنامه های بانک اطلاعاتی از این شی برای انجام 4 عمل اصلی بر روی بانک استفاده می شود .

 

SQLDataAdapter

DataAdaper را می توان به عنوان یک پل بین منبع اطلاعاتی واقعی (data source) و برنامه خودمان در نظر بگیریم که معمولا همراه DataSet مورد استفاده قرار می گیرد. استفاده DataAdapter و DataSet همراه با هم یک راه حل غیر متصل (disconnected) برای استفاده از منبع اطلاعاتی می باشد . معمولا با استفاده از کلاس تمامی سطر های جداول واکشی و سپس در یک Dataset قرار میگیرد .

 

DataSet

کلاس DataSet به شما این امکان را می دهد که داده ها را به صورت غیر متصل (disconnected) نگهداری و دستکاری کنید. یعنی یک بار از دیتابیس اطلاعات را می کشیم و در این کلاس نگه می داریم و هر کاری داشته باشیم با آن انجام می دهیم. این که می گوییم غیر متصل یعنی ما با اطلاعاتی که در دیتابیس وجود دارد کار می کنیم در حالی که از دیتابیس واقعی جدا هستیم و به آن دسترسی نداریم. در واقع ما به DataSet به عنوان یک دیتابیس کوچک که داخل حافظه قرار دارد نگاه می کنیم.

برای ارتباط با بانک اطلاعاتی ابتدا باید رشته اتصال ( Connection String) را تعریف نماییم . بهتر است رشته اتصال را یکبار در طول برنامه تعریف کنیم تا در سراسر برنامه و برای تمامی دستورات ارتباط با بانک از آن استفاده کنیم . یکی از راه ها ، استفاده از فایل App.Config هست . برای اضافه کردن این فایل به پروژه به صورت زیر عمل نمایید :
image1

image2

image3

همانطور که در شکل بالا مشاهده می کنید فایل App.Config با موفقیت به پروژه اضافه شده است . این فایل از قسمت های مختلفی تشکیل می شود و شما می توانید تنظیمات شخصی ، امنیتی ، رشته های اتصال و… را در این فایل تعریف کنید . در این برنامه ما فقط قصد دارید رشته اتصال را تعریف کنیم . برای این کار تگ connectionString را درون تگ configuration اضافه می کنیم . دوستان عزیز به این نکته توجه کنید که تمامی تگ های باید داخل تگ configuration تعریف شوند ( زیرا این فایل یک فایل XML هست و باید از قوانین XML منجمله اینکه تمامی تگ ها باید داخل یک مادر قرار داشته باشند ، تبعیت کند).
image4
بعد از اینکه تگ connectionString را به فایل اضافه کردین باید رشته اتصال بانک خود را درون این تگ مشخص نمایید . برای اینکار باید از تگ add استفاده کنید . این تگ دارای ویژگی های مختلفی می باشد از جمله provider ، name ، connectionString . شما باید مقدار این خصیصه ها را به درستی تنظیم نمایید . ابتدا از طریق تگ name یک نام واضح برای رشته اتصال تعیین کنید ، از طریق این نام رشته اتصال در سراسر برنامه مورد دسترسی قرار می گیرد . سپس نام provider بانک اطلاعاتی را از طریق مشخصه provider تعیین کنید . برای بانک اطلاعاتی sql server مقدار این گزینه برابر System.Data.SqlClient می باشد . در نهایت از طریق خصیصه ConnectionString مقدار رشته اتصال را مشخص کنید :

image5

در شکل بالا نام رشته اتصال برابر ConnectionString می باشد . بعد از اینکه مقدار رشته اتصال را در فایل App.Config تعریف کردیم باید از آن استفاده کنیم . برای واکشی مقدار رشته اتصال کلاسی به نام ConfigurationManager در فضای نام System.Configuration وجود دارد . با استفاده از این کلاس می توانید قسمت های متخلف App.Config از جمله قسمت ConnectionString را تغییر دهید . برای استفاده از این کلاس به شکل زیر ابتدا باید اسمبلی System.configuration را به پروژه اضافه نماییم :

image6

image7

image8

بر روی فرم دابل کلیک کرده و کدهای زیر را بنویسید :

   1: using System;
   2: using System.Collections.Generic;
   3: using System.ComponentModel;
   4: using System.Data;
   5: using System.Drawing;
   6: using System.Text;
   7: using System.Windows.Forms;
   8: 
   9: using System.Data.SqlClient;
  10: using System.Configuration;
  11: 
  12: 
  13: namespace frmMain
  14: {
  15:     public partial class frmMain : Form
  16:     {
  17: 
  18:             private SqlConnection DataBaseConnection;
  19:             private SqlCommand Command1;
  20:             private SqlDataAdapter DataAdapter1;
  21:             private DataSet DataSet1;
  22: 
  23:             public frmMain()
  24:             {
  25:             
  26:                 string ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
  27:                 this.DataBaseConnection = new SqlConnection(ConnectionString);
  28:                 this.Command1 = this.DataBaseConnection.CreateCommand();
  29:                 this.DataAdapter1 = new SqlDataAdapter(Command1);
  30:                 this.DataSet1 = new DataSet();
  31: 
  32:                 InitializeComponent();
  33:             }
  34:         
  35:         }
  36:     }

همانگونه که در خطوط 9 و 10 کد بالا مشاهده می کنید فضای نام های زیر را به کلاس اضافه کرده ایم:

using System.Data.SqlClient;
using System.Configuration;

مقدار تمامی رشته های اتصال در خصوصیت ConnectionStrings قرار دارد . باید نام رشته اتصال را به این خصوصیت ارسال کنید . فضای نامی که در خط 10 کد بالا اضافه شده است برای دسترسی به رشته اتصال می باشد. سپس در خط 26 مقدار رشته اتصال بدست می آید :

string ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;

در خطوط 21- 18 فیلد های زیر تعریف شده اند:

private SqlConnection DataBaseConnection;
private SqlCommand Command1;
private SqlDataAdapter DataAdapter1;
private DataSet DataSet1;

ما فیلدهایی را که برای وصل شدن به دیتابیس و تعریف کردن دستور SQL مورد استفاده قرار می گیرد را تعریف کرده ایم. فیلدها را به جای آنکه به عنوان متغیر های محلی تعریف کنیم به عنوان فیلدهای کلاس تعریف می کنیم. این کار باعث می شود که فیلدها همیشه در دسترس باشد و از تکرار کدنویسی جلوگیری شود (مثلا مجبور نشویم یک Connection برای بروزرسانی دانشجو و یکی دیگر برای حذف کردن بسازیم). سپس در سازنده کلاس کد های زیر را قرار دهید :

  26: string ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
  27: this.DataBaseConnection = new SqlConnection(ConnectionString);
  28: this.Command1 = this.DataBaseConnection.CreateCommand();
  29: this.DataAdapter1 = new SqlDataAdapter(Command1);
  30: this.DataSet1 = new DataSet();

در سازنده کلاس فرم (خطوط 33 – 23) فیلدهای کلاس مقداردهی می شوند مثلا connection مقداردهی می شود و connection string برای آن مشخص می شود. برای ارتباط با بانک اطلاعاتی نیاز به یک شی Connection داریم . به این خاطر که بانک اطلاعاتی ما SQL Server هست باید یک شی از کلاس SQLConnection ایجاد کنیم . سپس مقدار رشته اتصال را برای سازنده آن ارسال می کنیم . در خط 28 دستور را ایجاد می کنیم . با استفاده از Command دستوراتی راه به بانک اطلاعاتی ارسال می کنیم . مثلا دستور ثبت اطلاعات ، حذف و… . برای ایجاد شی Command دو راه داریم . یا اینکه با استفاده از عملگر new یک شی از این کلاس ایجاد کنیم و مقدارخاصیت Connection آن را به طور دستی مقدار دهی کنیم به شکل زیر :

this.Command1 = new SqlCommand();
Command1.Connection = this.DataBaseConnection;

یا اینکه به راحتی می توانیم متد CreateCommand شی Connection را فراخوانی کنیم :

this.Command1 = this.DataBaseConnection.CreateCommand();

خط بالا عملی مشابه ای با کد قبلی انجام می دهد و دستوری را ایجاد می کند که به طور خودکار به شی کانکشن متصل است . در خط 29 شی DataAdapter را ایجاد کرده ایم . این شی به طور خلاصه به شکل یک میانجی بین بانک و برنامه عمل می کند به طوری که دستوری را از برنامه می گرد و روی بانک اعمال می کند یا اینکه رکوردهایی را از بانک گرفته و به برنامه تحویل می دهد . دستوری که این شی روی بانک اعمال می کند از طریق سازنده آن مشخص می کنیم . در خط آخر هم DataSet را ایجاد کرده ایم . وظیفه اصلی این کلاس نگهداری اطلاعاتی است که از بانک اطلاعاتی واکشی می کنیم . معمولا از این کلاس به عنوان منبع داده Datagridview استفاده می کنیم. در این درس با نحوه ی ارتباط با بانک اطلاعاتی آشنا شدیم . با استفاده از کد هایی که در بالا نوشتیم می توانیم با بانک اطلاعاتی ارتباط برقرار کنیم . در درس های بعدی شما را با نحوه ی درج اطلاعات در بانک آشنا می کنم .

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

  1. arashbashiri پاسخ دادن

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

    • یونس ابراهیمی پاسخ دادن

      بسیار ممنون از لطفتون

  2. m karimy پاسخ دادن

    با سلام
    این دوستمون درست فرمودند. من خودمم حدودن چند وقتیه میخام معماری چند لایه یاد بگیرم. کلی آموزش به شکل های مختلف را مطالعه کردم. تا جایی که من کار کردم، هرکدوم به نوعی با دید متفاوتی به این مسئله نگاه کردن ضمن اینکه آموزش ها هم کامل نبوده اند. جای تشکر بسیار هست از شما وتمام دوستان تلاشگرتون. انشالا آموزش هاتون توی مبحث را ادامه بدید.

  3. Ehsan Nozari پاسخ دادن

    روشهایی که گفته شد اصلا روشهای اصولی و حرفه ای نیستن و یا اینکه به راحتی میشه به دیتابیس برنامه دسترسی پیدا کرد،در نتیجه یک روش امن و مطمئن به حساب نمیاد.

    خیلی در این مورد تحقیق کردم و بعد از کلی تحقیق خوشبختانه به مطلوب ترین روش و یا بهتر بگم استانداردی ترین روش دست پیدا کردم،

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

    این شمار بنده هستش : 09358350348

    با تشکر از همه ی شما دوستان برنامه نویس…

  4. مهدی موسوی پاسخ دادن

    با سلام و عرض ادب و تشکر از حرکت بسیار ستودنی شما در آموزش برنامه نویسی
    لطفا روش تعریف محل دیتابیس در کانکشن استرینگ در فایل app.config را با استفاده از ” @ ” را هم توضیح دهید متاسفانه در آموزش خریداری شده اشاره ای نشده است

    با تشکر

    • وحید باقی پاسخ دادن

      سلام ، با تشکر از نظر شما.
      متاسفانه آموزش ها رو با دقت مشاهده نکردید.در پروژه مدیریت مدرسه و بخش فرم ورود توضیح داده شده که برای اتصال به پایگاه داده شما میتونید رشته اتصال رو هم مستقیما مشخص کنید که از علامت @ پشت آن استفاده می شود.البته علامت @ مختص تعریف رشته های اتصال نیست!! و کاربرد آن بلا اثر کردن کاراکتر های کنترلی هست (این موضوع هم کامل در مجموعه توضیح داده شده).به دلیل اینکه این روش اصولی نیست ، برای همین در فیلم ها توضیح ندادیم.فرض کنید شما در 20 محل رشته اتصال رو استفاده کرده باشید ، حالا اگر یک تغییر کوچک بخواید بدید باید 20 جا رو ویرایش کنید.این روش چیز خاصی نیست و در واقع رشته اتصال رو مستقیما داخل متد سازنده کلاس SqlConnection با علامت @ پشت آن می نویسید به همین سادگی!
      روش دیگر برای مشخص کردن رشته اتصال تعریف آن در app.config است که کامل توضیح داده شده است.یعنی شما یک بار رشته اتصال را تعریف میکنید و در همه جای برنامه با روشی که در آموزش گفته شده می توانید استفاده کنید.این موضوع نه تنها اشاره شده بلکه کامل هم توضیح داده شده.
      سوال شما کمی مبهم و نادرست است.استفاده از @ در app.config به چه معنی است؟ اصلا نیازی به استفاده از @ نیست!
      توضیح ندادن مبحثی که اصولی نیست که متاسفانه نداره ، باید بگید خوشبختانه!
      لطفا آموزش ها را کامل و با دقت مشاهده کنید.
      موفق باشید

  5. مهدی موسوی پاسخ دادن

    با سلام وتشکر از پاسخ شما
    دقیقا اتفاقا خیلی روش خوبیه که کانکشن استرینگ رو تو فایل app.config قرار بدیم برای تغییرات خیلی اصولی تره

    متاسفانه بدلیل کمبود وقت مباحث را سریع مشاهده کرده ام ……
    مشکل من اینجاست که نتونستم دیتابیس رو بهش آدرس بدم که در کنار فایل اجرایی داخل یک پوشه باشه

    آدرس فایل اصلی:

    وقتی میخوام اینطوری آدرس بدم کنار فایل اصلی و داخل یه پوشه خطا میده و اجازه ذخیره تو فایل xml نمیده:

    من منظورم روش آدرس دهی بود

    تشکر از وقتی که برای پاسخ دهی گذاشتید

    • وحید باقی پاسخ دادن

      سوالتون رو توی انجمن پرسش و پاسخ با جزئیات (یعنی اون تکه کدی که نوشتید و خطا داده ، متن خطا و ..) رو بنویسید تا دوستان بررسی کنند.در بخش نظرات سخته نوشتن جزئیات

  6. مرتضی پاسخ دادن

    با سلام،
    یه سوال داشتم، من با ایجاد یه دیتابیس محلی برنامه دفترچه تلفن رو نوشتم،
    موقع ایجاد دیتاست و tableadapter هم دیتابیس رو توی دایرکتوری برنامه کپی کردم، به این صورت که فایل app.config خود به خود ایجاد شد و کد زیر بهش اضافه شد

    اما مشکل من اینه که برنامه فقط توی کامپیوتر خودم میتونه به دیتابیس متصل بشه و روی کامپیوترهای دیگه نمیشه، فکر میکنم مشکل از آدرس dataSource هست
    اگه امکان داره راهنمایی کنید.

    در ضمن من از assembely های sql هم تو برنامه استفاده نکردم

  7. مرتضی پاسخ دادن

    connectionString=”Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\PhoneBook.mdf;Integrated Security=True;Connect Timeout=30″ providerName=”System.Data.SqlClient”/>

    • یونس ابراهیمی پاسخ دادن

      سلام، ممنون میشم سوالتونو تو بخش پرسش و پاسخ سایت مطرح بفرمایید (w3-farsi.com/forum)