ایران سرفراز- نرم افزار وپروژهای دانشجویی


نرم افزار وپروژهای دانشجویی

فصل بیست وسوم بانک اطلاعاتی با ADO.NET و SQL SERVER در #C

<!-- /* Font Definitions */ @font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-1610611985 1107304683 0 0 159 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Times New Roman","serif"; mso-fareast-font-family:"Times New Roman";} .MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-size:10.0pt; mso-ansi-font-size:10.0pt; mso-bidi-font-size:10.0pt;} @page Section1 {size:595.3pt 841.9pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:35.4pt; mso-footer-margin:35.4pt; mso-paper-source:0; mso-gutter-direction:rtl;} div.Section1 {page:Section1;} -->

فصل بیست و سوم

برنامه نویسی بانک اطلاعاتی با

C#  در ADO.NET و SQL SERVER

آنچه که در این فصل یاد خواهید گرفت:

ADO.NET آشنایی با اشیای

نحوه ی اتصال کنترل ها به داده ها

ADO.NET در DateView بررسی روشهای جستجو و یا مرتب سازی داده های درون حافظه با استفاده از اشیای

آشنا خواهیم ADO.NET با نحوه انتخاب ، درج، ویرایش و یا حذف داد ه های درون یک بانک اطلاعاتی به وسیل ه ی

شد.

SQL Server برنامه نویسی پایگا هداده های تحت

-1-23 مقدمه

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

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

اینکه لازم باشد کدی وارد کنیم، توانستیم امکاناتی مانند مرتب کردن داد هها را نیز به برنامه اضافه کنیم.

در تمام این موارد از یک ویزارد استفاده کردیم و آن ویزارد کدهای زیادی را برای انجام موارد مورد نظر ما نوشت، کدهایی

مخصوص برای جداول مورد DataSet و نیز ایجاد یک DataAdapter مانند ایجاد اتصال به بانک اطلاعاتی، تنظیم کردن

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

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

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

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

فصل قبل برای دسترسی به داد ه ها و یا تغییر در آنها استفاده کردیم ، از قبیل کنترل هایی برای دریافت اطلاعات از بانک

اطلاعاتی،کنترل هایی برای ذخیره آنها در حافظه و نیز کنتر ل هایی برای متصل کردن این داد ه ها به کنتر ل های موجود در فرم ،

mohsen_mahyar@yahoo.com - C# برنامه نویسی

402

ADO.NET شناخته م ی شوند. در این فصل سعی خواهیم کرد با توانای ی ها و قابلیتهای درونی ADO.NET همه مجموعاً به نام

برای دسترسی به داد ه های درون یک بانک اطلاعاتی و نیز ایجاد تغییرات در آنها آشنا شوی م . همچنین مشاهده خواهیم کرد

درون حافظه ذخیره شده است را تغییر دهیم ، فیلتر کرده و یا DataSet که چگونه م ی توان داده هایی که به وسیله یک

ویرایش کنیم.

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

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

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

ها ) و یا چگونه م ی توان با استفاده از اشیایی مانند TextBox یک رکورد را نمایش دهن د (برای مثا ل ، مانند

بین رکوردها حرکت کرد. CurrencyManager

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

به آنها دسترسی پیدا SqlClient آشنا خواهیم شد و خواهیم دید چگونه م ی توان به وسیل ه ی سرویس دهند ه ی اطلاعاتی

که برای کار با بانک اط لا عاتی ) OleDb نسبت به سرویس دهند ه ی اطلاعاتی ،SqlClient کرد. سرویس دهنده ی اطلاعاتی

SQL استفاده می شود) از سرعت بیشتری برخوردار است، اما فقط م یتواند با بانک های اطلاعاتی تحت Access ایجاد شده با

کار کند. Server

SQL 2000 یا SQL Server ،7SQL Server برای انجام تمرینات این فصل لازم است که به یکی از نرم افزارهای

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

استفاده شده است. (Pubs دارد (بانک اطلاعاتی

ADO.NET-2-23

NET همانطور که در ابتدای فصل نیز ذکر شد ، به مجموعه کنتر ل هایی که برای دسترسی به داد ه های یک بانک اطلاعاتی در

برای دسترسی به داد ه ها از معماری غیرمتصل استفاده م ی کند .معماری ADO.NET . گفته م ی شود ADO.NET استفاده می شود

غیر متصل به این معنی است که ابتدا برنامه به موتور بانک اطلاعاتی مورد نظر متصل شده ، داده های مورد نیاز خود را از بانک

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

تغییرات مورد نظر خود را در داد ه های موجود در حافظه انجام م ی دهد. هر زمان که لازم باش د ، تغییرات ایجاد شده در بانک

اطلاعاتی ذخیره شوند ، برنامه یک اتصال جدید را به بانک اطلاعاتی ایجاد کرده و از طریق این اتصال تغییراتی را که در

داده ها اعمال کرده بود را در جدول اصلی ایجاد م ی کند. کنترل های اصلی که داد ه های دریافتی از بانک اطلاعاتی را در حافظه

تشکیل DataTable است . این کنترل خود از چند کنترل دیگر مانند اشیایی از نوع DataSet نگهداری می کند،کنترل

مورد نظر خود را SELECT شده است . بعد از اینکه داد ه ها در حافظه قرار گرفتند م ی توانید بین آنها جستجو کنید ، دستورات

روی آنها اجرا کرده و آنها را به این وسیله فیلتر کنید و یا تغییراتی را در این داد ه ها ایجاد کنید که در طی این فصل با

نحوه ی انجام این موارد آشنا خواهیم شد.

استفاده از معماری غی ر متصل مزایای زیادی دارد که مهمترین آن افزایش توانایی برنامه در سرویس دادن به چندین کاربر به

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

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

فقط در مواقع مورد نیاز به بانک اطلاعاتی متصل م ی شوند و بعد از اجرای وظایف لاز م ، اتصال خود را قطع م یکنند، به این

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

ADO.NET با SQL Server فصل بیست و سوم استفاده از بانک اطلاعاتی

403

Data -1 فضای نامی -2-23

قرار م ی گیرند، این فضای نا م ی خود نیز شامل چند فضای نا م ی System.Data در فضای نام ADO.NET کلاس های اصلی

فضای نامی .System.Data.SqlClient و System.Data.OleDb دیگر است که مهمترین آنها عبارتند از

SQL شامل کلاس هایی است که برای دسترسی به بانک های اطلاعاتی ایجاد شده به وسیل هی System.Data.SqlClient

نیز حاوی کلا س هایی است که برای دسترسی به بان ک های System.Data.OleDb به کار م ی رود. فضای نام ی Server

مورد استفاده قرار می گیرد. (Access مانند بانک های اطلاعاتی ) OLE اطلاعاتی از نوع

و System.Data.OracleClient دو فضای نام دیگر وجود دارند که عبارتند از System.Data در فضای نا م ی

برای دسترسی به بانک اطلاعاتی ایجاد شده به وسیل ه ی موتور بانک OracleClient فضای نام ی .System.Data.Odbc

مورد استفاده قرار می گیرد. Oracle اطلاعاتی

برای دسترسی به بان ک های SqlClient کلاس های موجود در این فضای نام نیز ، همانند کلا سهای موجود در فضای نام

نیز حاوی کلا س هایی است که برای دسترسی به بان ک های Odbc بهینه سازی شده اند. فضای نام Oracle اطلاعاتی از نوع

را پشتیبانی نم یکنند ایجاد شده است. OleDB که تکنولوژی ODBC اطلاعاتی قدیمی از نوع

به عنوان سروی س دهنده های اطلاعاتی ADO.NET در Odbc و نیز OracleClient ،OleDb ،SqlCient فضای نامهای

سرویس دهنده های اطلاعاتی دیگری نیز وجود دارند ، اما در ط  ی این کتاب فقط بر روی دو .NET شناخته می شوند. در

سرویس دهنده ی اول تمرکز خواهیم کرد.

دسترسی خواهیم داشت. SQL Server به بانک های اطلاعاتی از نوع SqlClient در طی این فصل با استفاده از فضای نام

استفاده از دیگر سرویس دهند ه های اطلاعاتی نیز بسیار مشابه استفاده از این سرویس دهنده اس ت . ADO.NET البته در

بنابراین به راحتی م ی توانید از تکنیکهایی که با استفاده از کلا س های موجود در این فضای نا م ی خواهید آموخت در سرویس

را در این قسمت به کار OleDB استفاده کنید و یا تکنیکهای سرویس دهند ه هایی مانند OleDB دهنده های دیگر نیز از قبیل

بر اساس نوع موتور بانک اطلاعاتی که داد ه های شما به وسیل ه ی آن ایجاد شد ه اند، یکی از سرویس ADO.NET ببرید. در

دهنده های موجود را انتخاب کرده و از آن استفاده م ی کنید. اما لازم نیست که مجدداً نحو ه ی استفاده از آن سرویس دهنده

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

بیاموزید می توانید به راحتی از دیگر سرویس دهند هها نیز استفاده کنید.

کلاس های موجود در این سرویس دهند ه های اطلاعاتی به حدی زیاد هستند که نم ی توانیم تمام آنها را در این قسمت معرفی

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

می شویم.

این کلا سها عبارتند از:

SqlConnection

SqlCommand

SqlDataAdapter

SqlParameter

مورد استفاده قرار م ی گیرند . SQL Server به خاطر داشته باشید که این کلا سها فقط برای ارتباط با بان کهای اطلاعاتی

می توانید از کلاس های متناظر اینها در فضای نا م ی OLEDB برای استفاده از بان ک های اطلاعاتی

به برنامه اضافه کرد تا لازم نباشد هر بار با نام کامل آنها را using را با استفاده از راهنمای System.Data.SqlClient

وارد کنیم. بنابراین به خاطر داشته باشید که در ابتدای برنامه های این قسمت دستور زیر را نیز اضافه کنید:

using System.Data.SqlClient;

را System.Data باید فضای نا م ی DataView و یا DataSet مانند ADO.NET همچنین برای استفاده از کلا س های پایه ای

نیز به برنامه اضافه کنیم. بنابر این در ابتدای برنام ههای خود دستور زیر را نیز وارد کنید.

mohsen_mahyar@yahoo.com - C# برنامه نویسی

404

using System.Data;

داشته باشیم و نحو ه ی کاربرد آنها را SqlClient خوب بهتر است که ابتدا نگاهی به کلا س های اصلی موجود در فضای نام

بررسی کنیم.

:SqlConnection -2 کلاس -2-23

در قلب کلا س هایی قراردارد که در این قسمت مورد استفاده قرار SqlConnection تقریباً می توانیم بگوییم که ک لاس

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

به آن ارسال کنی د . این پارامتر متغیری از ConnectionString نمونه از این کلاس را ایجاد کنید ، باید پارامتری را به نام

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

در این کلاس مقدار آن را تغییر داده و رشت ه ی ConnectionString این کلاس ، نیز م ی توانیم با استفاده از خاصیت

با استفاده از اطلاعاتی که در کادر VS ، جدیدی را برای این پارامتر مشخص کنی م . در برنامه هایی که در فصل قبل ایجاد کردیم

قرار می داد. اما اغلب بهتر SqlConnection دریافت می کرد، چنین متنی را ایجاد کرده و در اختیار Add Connction

را خودمان بنویسی م . برای این کار ابتدا باید بدانیم که ساختار این مت ن ها ConnectionString است که متن لازم برا ی

باید چگونه باشد.

ring ConnectionSt ایجاد بخش های مختلف

باید مورد استفاده قرار گیر د ، بستگی به سرویس دهند ه ی اطلاعاتی دارد که ConnectionString ساختار متنی که برای

به عنوان موتور بانک اطلاعاتی برنامه خود استفاده SQL Server مورد استفاده قرار می دهیم. برای مثال اگر بخواهیم از

در برنامه استفاده کنی م )، باید مقادیر پارامترهای SqlClient کنیم (به این ترتیب لازم است که از سرویس دهند ه ی

را طبق جدول زیر مشخص کنیم. Database و Server

پارامتر توضیح

نام سرور بانک اطلاعاتی که م ی خواهید از آن استفاده کنید. این پارامتر معمولاً حاوی نام Server

در آن نصب شده اس ت . اگر SQL Server کامپیوتری است که موتور بانک اطلاعاتی

بر روی همان کامپیوتری که برنامه را اجرا م ی کند ، نصب شده است ، SQL Server

برای این پارامتر استفاده کنی د . اما ،localhost و ی ا local می توانید از مقادیری مانن د

ای که در کامپیوتر دیگری در شبکه نصب شده است استفاده م یکنید، SQL Server اگر

لازم است که مقدار این پارامتر را برابر با نام آن کامپیوتر در شبکه قرار دهی د . همچنین

قرار داشته باشد، باید بعد از نام کامپیوتر SQL Server اگر در آن کامپیوتر بیش از یک

ای که می خواهید مورد استفاده قرار SQL Server یک علامت \ قرار داده و سپس نام

دهید را ذکر کنید.

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

.(Pubs (برای مثال بانک اطلاعاتی

باید هنگام دسترسی به آنها ابتدا هویت ،SQL Server برای ایجاد امنیت در بان کهای اطلاعاتی ایجاد شده به وسیله ی

مشخص شود. بنابراین اگر بخواهیم توسط یک برنامه به داد ههای موجود در یک بانک SQL Server استفاده کننده توسط

اطلاعاتی دسترسی داشته باشیم، باید اطلاعات لازم برای این تعیین هویت را همراه با دیگر اطلاعات در متن

انجام شود. SQL Server مشخص کنیم. این تعیین هویت به دو روش م یتواند توسط ConnectionString

ADO.NET با SQL Server فصل بیست و سوم استفاده از بانک اطلاعاتی

405

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

قرار دهیم. ConnectionString پارامتر را به صورت مستقیم در متن

روش دوم: استفاده از حساب کاربری است که در ویندوز از آن استفاده م یکنیم.

تعیین هویت شویم، باید پارامترهای نام کاربری و کلم ه ی SQL Server برای اینکه بتوانیم با استفاده از روش اول توسط

قرار دهیم. ConnectionString عبور را همانطور که در جدول زیر شرح داده شده است، در متن

پارامتر توضیح

این پارامتر باید حاوی نام کاربری باشد که برای اتصال به بانک اطلاعاتی م ی خواهیم از آن User ID

استفاده کنیم . برای اینکه بتوانیم با استفاده ا ز این روش از بانک اطلاعاتی استفاده کنیم ،

ایجاد شده و اجازه ی دسترسی به SQL Server باید یک حساب کاربری به این نام در

داده های مورد نیاز نیز به آن داده شود.

کلمه ی عبوری که برای این نام کاربردی مورد استفاده قرار م یگیرد. Password

می تواند به گون های تنظیم شود که برای تعیین هویت کاربرانی که به آن دسترسی پیدا می کنند SQL Server علاوه بر این

از حساب ویندوزی که با آن وارد کامپیوتر شد ه اند استفاده کن د . در این صورت دیگر نیازی نیست که در متن

Integrated مقادیر نام کاربری و کلم هی عبور را وارد کنید، بلکه فقط باید مشخص کنید که از ConnectionString

نامیده می شود که با استفاده از آن Integrated Security استفاده می کنید(این سیستم به این علت Security

با یکدیگر سعی خواهند که به حداکثر امنیت ممکن در ایجاد یک ارتباط دسترسی پیدا کنند و SQL Server ویندوز و

قرار دهی م ). برای ConnectionString دیگر نیازی نباشد که ن ا م کاربری و کلم ه ی عبور را به صورت مستقیم در متن

قرار true برابر با ConnectionString را در متن Integrated Security استفاده از این سیستم باید مقدار پارامتر

دهید.

به حساب کاربری که برای این فرد در ویندوز SQL Server البته توجه داشته باشید که در این روش نیز باید در محیط

ایجاد شده است ، اجازه ی دسترسی به اطلاعات موجود داده شود ، در غیر این صورت کاربر نم ی تواند به بانک اطلاعاتی متصل

تنظیم م ی شوند، به قطعه ک  د زیر ConnetionString شود. برای اینکه بهتر متوجه شوید که چگونه پارامترهای لازم در

به کار می رود. SqlConnection نگاه کنید. این کد برای ایجاد یک شیئ جدید از نوع

SqlConnection objConnection = new

SqlConnection("Server=localhost;Database=Pubs;User" +" ID=sa;Password=csdotnet;");

به کار م ی رود. مقدار SQL Server برای است ف اده از یک ConnectionString همانطور که مشاهده می کنید این

که می خواهیم از آن استفاده کنیم در کامپیوتری قرار دارد که برنامه SQL در پارامتر مشخص م ی کند که سرور localhost

نیز نام بانک اطلاعاتی که م ی خواهیم به آن متصل شویم را تعیین م ی کند . Database در آن اجرا شده اس ت . مقدار پارامتر

به کار می رود. در آخر نیز مقدار پارامترهای Pubs برای دسترسی به بانک اطلاعاتی ConnectionString در این جا ا ی ن

مشخص می شوند که برای تعیین نام کاربری و کلم هی عبور لازم برای دسترسی به اطلاعات به کار Password و User ID

می روند. دقت کنید که برای تعیین مق د ار هر پارامتر از علامت = و برای جدا کردن پارامترهای مختلف از یکدیگر از علامت ;

استفاده شده است.

متصل شدن و قطع کردن اتصال از یک بانک اطلاعاتی

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

به بانک اطلاعاتی متصل شده و یا اتصال خود را قطع کنی م . یک نمونه SqlConnection در کلاس Close و Open متدهای

از این کار در قطعه کد زیر نشان داده شده است:

mohsen_mahyar@yahoo.com - C# برنامه نویسی

406

// Open the database connection

objConnection.Open();

// ... Use the connection

objConnection.Close();

// Close the database connection

وجود دارند که م ی توانیم در برنامه از آنها استفاده SqlConnection البته متدها و خاصی ت های فراوان دیگری در کلاس

کنیم، اما مواردی که در اینجا با آنها آشنا شدیم ، پرکاربردترین آنها به شمار م ی روند و فکر م ی کنم که برای شروع فقط

آشنایی با این موارد کافی باشد.

SqlCommand -3 کلاس -2-23

برای اجرا روی داد ه های دریافت شده از بانک اطلاعاتی اس ت . این دستور SQL حاوی یک دستور SqlCommand کلاس

برای درج داد ه های جدید در بانک INSERT برای انتخاب داد ه هایی خاص،یک دستور SELECT می تواند یک دستور

برای حذف داد ه ها از بانک اطلاعات و یا حتی فراخوانی یک پروسیجر ذخیره شده در بانک DELETE اطلاعاتی، یک دستور

ای که در این کلاس نگهداری م یشود می تواند شامل پارامترها نیز باشد. SQL اطلاعاتی باشد. دستور

شده است ، اما س اده ترین آنها برای ایجاد یک شیئ از Overload چندین نسخه SqlCommand از متد سازند ه ی کلاس

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

را نمایش م یدهد: SqlCommand متدهای موجود، آن شی را تنظیم کنید. قطعه کد زیر نحو هی ایجاد یک شی از نوع

SqlCommand objCommand = new SqlCommand();

به تنهایی استفاده نم ی کنند، بلکه آنها را با SqlCommand در برنامه های بانک اطلاعاتی معمولاً از اشیای ایجاد شده از کلاس

و یا ... که در آ ن INSERT،SELECT ها به کار م ی برند. به این ترتیب م ی توانند از دستور DataAdapter ها و DataSet

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

دارد، اما منابع سیستم Dataset کاربردی همانند DataReader مورد استفاده قرار گیرن د . کلاس DataReader از کلاس

(مانند حافظه و ...) را کمتر مصرف م ی کند و انعطا ف پذیری کمتری نیز دار د . در ادامه ی این فصل بیشتر تمرکز خود را روی

قرار خواهیم داد. DataSet نحوه ی استفاده از این اشیا با کلاس

Connection خاصیت

استفاده کنیم باید بعضی از خاصی ت های آن را تنظیم کنی م . اولین SqlCommand قبل از اینکه بتوان ی م از یک شی از کلاس

است . این خاصیت همانطور که در قطعه کد زیر نمایش داده شده است ، Connection خاصیتی که باید تنظیم شود ، خاصیت

را دریافت کند: SqlConnection می تواند یک مقدار از نوع

objCommand.Connection = objConnection;

ای که در این شی نگهداری م ی شود را با موفقیت اجرا کرده و نتیج ه ی آن را دریافت کنیم ، SQL برای اینکه بتوانیم دستور

اتصال با بانک اطلاعاتی را برقرار کرده و سپس دستور را اجرا کنیم. SqlConnection در Open ابتدا با استفاده از متد

CommandText خاصیت

است . این خاصیت متنی را دریافت می کند که می تواند حاوی CommandText خاصیت بعدی که باید تنظیم کنیم ، خاصیت

و یا فراخوانی یک پروسیجر ذخیره شده در بانک اطلاعاتی باشد که باید روی داد ه ها اجرا شو د . برای مثا ل ، SQL یک دستور

که در این خاصیت قرار داده شده است را نمایش م یدهد: SQL قطعه کد زیر یک نمونه از دستور

SqlConnection objConnection = new

SqlConnection("Server=localhost;Database=Pubs;User " +

"ID=sa;Password=csdotnet;");

SqlCommand objCommand = new SqlCommand();

objCommand.Connection = objConnection;

objCommand.CommandText = "INSERT INTO authors " +

"(au_id, au_lname, au_fname, contract) " +

"VALUES('123-45-6789', 'Barnes', 'David', 1)";

ADO.NET با SQL Server فصل بیست و سوم استفاده از بانک اطلاعاتی

407

است که برای درج یک رکورد از اطلاعات در یک جدول به کار م ی رود. این SQL یکی از دستورات ساده INSERT دستور

au_id ایجاد کن . سپس فیل  د authors دستور در این ق سمت بیان م ی کند که " یک رکورد جدید از اطلاعات در جدول

را برابر با au_fname قرار بده، فیلد Barnes را برابر با au_iname 6789 ' قرار بده، فیلد =45- این رکورد را برابر با ' 123

را نیز برابر با 1 قرار بده ." Contract قرار بده و فیلد 'David'

برای درج یک ردیف از اطلاعات ذر یک جدول ب ه این صورت است که بعد از دستور INSERT روش استفاده از دستور

نام جدولی که م یخواهیم اطلاعات در آن قرار بگیرد را ذکر م یکنیم. سپس نام فیلدهایی را که باید کامل INSERT INTO

نوشته و در VALUES کنیم، را در داخل یک پرانتز م ی آوریم و هر یک را نیز با یک ویرگول از هم جدا م ی کنیم. سپس عبارت

یک پرانتز دیگر، مقدار مورد نظر برای آن فیلدها را به ترتیب وارد م یکنیم.

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

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

را به گون ه ای ایجاد کنیم که همانند یک متد، پارامتر دریافت کنن د . سپس SQL می شوند. خوشبختانه می توانیم دستورات

هنگام اجرای برنامه این پارامترها را از کاربر دریافت کرده و آنها را در دستور قرار م ی دهیم و دستور را اجرا م ی کنیم . بهتر

قرار گیرند آشنا شویم. SqlCommand است مقداری هم با پارامترهایی که می توانند در شی

Parameters خاصیت

را ارائه کنیم، باید با مفهوم جاگیرنده 1ها آشنا شوید که SQL قبل از اینکه بتوانیم نحو ه ی استفاده از پارامترها در یک دستور

قرار م ی گیرند و م ی توانند در زمان اجرای برنامه جای خود را با عباراتی خاص SQL متغیرهایی هستند که در یک دستور

استفاده SQL عوض کنند . این متغیرها با علامت @در یک دستور مشخص م ی شوند و هنگامی که از آنها در یک دستور

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

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

صورت زیر عمل کنیم:

همانطور که مشاهده م ی کنید در اینجا به جای اینکه از چند مقدار ثابت ذر ذستور استفاده کنیم، از چند جاگیرنده استفاده

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

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

آن ساده تر باشد.

SqlConnection objConnection = new

SqlConnection("Server=localhost;Database=Pubs;User " +

"ID=sa;Password=csdotnet;");

SqlCommand objCommand = new SqlCommand();

objCommand.Connection = objConnection;

objCommand.CommandText = "INSERT INTO authors " +

"(au_id, au_lname, au_fname, contract) " +

"VALUES(@au_id, @au_lname, @au_fname, @au_contract)";

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

با مقادیر مناسب تعویض کنی م . این کا ر به صورت اتوماتیک توسط برنامه در زمان اجرای دستور انجام م ی شود. اما ابتدا باید

قرار م ی دهیم تا SqlCommand در شیئایجاد شده از کلاس Paramaters پارامترهایی را ایجاد کرده و آن را در لیست

برنامه بداند هنگام اجرای دستور هر جاگیرنده را باید با مقدار چه متغیری د ر برنامه عوض کن د . توجه کنید که اصطلاح پارامتر

1 PlaceHolder

mohsen_mahyar@yahoo.com - C# برنامه نویسی

408

و یا پروسیجر ذخیره شده در بانک اطلاعاتی SQL در این قسمت به پارامترهایی اشاره م ی کند که برای اجرای یک دستور

به متدها فرستاده می شود. #C لازم است، نه به پارامترهایی که در ویژوال

Parameters وجود دارد م ی توانیم از خاصیت SqlCommand برای دسترسی به لیست پارامترهایی ک ه در یک شی از کلاس

در این کلاس استفاده کنی م . این خاصیت حاوی لیستی از جاگیرنده ها به همراه متغیرهای وابسته به آنها اس ت . بنابراین در

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

ساده ترین روش انجام این کار در کد زیر نشان داده شده است.

SqlConnection objConnection = new

SqlConnection("Server=localhost;Database=Pubs;User

ID=sa;Password=csdotnet;");

SqlCommand objCommand = new SqlCommand();

objCommand.Connection = objConnection;

objCommand.CommandText = "INSERT INTO authors " +

"(au_id, au_lname, au_fname, contract) " +

"VALUES(@au_id, @au_lname, @au_fname, @au_contract)";

objCommand.Parameters.AddWithValue("@au_id",

txtAuId.Text);

objCommand.Parameters.AddWithValue("@au_lname",

txtLastName.Text);

objCommand.Parameters.AddWithValue("@au_fname",

txtFirstName.Text);

objCommand.Parameters.AddWithValue("@au_contract",

chkContract.Checked);

نام یک جاگیرنده و متغیری که مقدار مربوط به آن را در زمان اجرای برنامه نگهداری م ی کند را به AddWithValue متد

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

عوض شو د . همچنین txtAuId کنترل Text باید با مقدار خاصیت au_id@ هنگام اجرای دستور ، مکان جاگیرنده با نام

عوض شود و ... txtLastName مربوط به کنترل Text نیز با مقدار خاصیت au_lName@ مکان جاگیرنده با نام

ExecuteNonQuery متد

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

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

را اجرا کنی د . البته این متد همانطور که نام آن نیز مشخص م ی کند فقط زمانی کاربرد دارد که بخواهیم SqlCommand

SqlCommand دستوری را روی بانک اطلاعاتی اجرا کنیم که داد ه ای را بر نم ی گرداند. برای مثال ، اگر دستور موجود در ش ی

باشد که اطلاعاتی را از جدول استخراج کرده و آنها را به برنامه دهد، نم ی توانیم برای اجرای آن از این SELECT یک دستور

متد استفاده کنی م . اما اگر دستور مورد استفاده فقط تغییراتی را در داد ه های بانک اطلاعاتی ایجاد کند ( برای مثا ل ، یک

رکورد از اطلاعات را به جدول اضافه کند) می توانیم با فراخوانی آن متد دستور را در بانک اطلاعاتی اجرا کنیم.

این متد بعد از اجر ا، عددی را به عنوان خروجی بر م ی گرداند که مشخص کنند ه ی تعداد رکوردهایی است که با اجرای این

تغییر کرده اند. این عدد معمولاً برای بررسی صحت اجرای دستور مورد استفاده قرار م ی گیرد . قطعه کد زیر SQL دستور

را در برنامه نشان می دهد. ExecuteNonQuery نحوه ی استفاده از دستور

SqlConnection objConnection = new

SqlConnection("Server=localhost;Database=Pubs;User

ID=sa;Password=csdotnet;");

SqlCommand objCommand = new SqlCommand();

objCommand.Connection = objConnection;

objCommand.CommandText = "INSERT INTO authors " +

"(au_id, au_lname, au_fname, contract) " +

"VALUES(@au_id, @au_lname, @au_fname, @au_contract)";

objCommand.Parameters.AddWithValue("@au_id",

txtAuId.Text);

objCommand.Parameters.AddWithValue("@au_lname",

ADO.NET با SQL Server فصل بیست و سوم استفاده از بانک اطلاعاتی

409

txtLastName.Text);

objCommand.Parameters.AddWithValue("@au_fname",

txtFirstName.Text);

objCommand.Parameters.AddWithValue("@au_contract",

chkContract.Checked);

objConnection.Open();

objCommand.ExecuteNonQuery();

objConnection.Close();

SqlDataAdapter -4 کلاس -2-23

در برنام ه های بانک اطلاعاتی ، همانند پلی بین جداول بانک اطلاعاتی و نیز داد ه های موجود در حافظه DataAdapter کلاس

نگهداری م ی شوند، عمل می کنند. این کلاس برای دسترسی به بانک اطلاعاتی از شی ایجاد شده از DataSet که به وسیل ه ی

ی که به آن نسبت داده م ی شود استفاده م ی کند و همانطور که م ی دانید، هر شی از کلاس SqlCommand کلاس

است که ارتباط آن را با بانک اطلاعاتی برقرار م ی کند . بنابراین SqlConnection حاوی شیئی از کلاس SqlCommand

SqlConnection و SqlCommand برای دسترسی به بانک اطلاعاتی از کلاس DatAdapter می توانیم بگوئیم که کلاس

استفاده می کند.

است که از دستور موجود در آن شیئ برای دریافت SelectCommand دارای خاصیتی به نام DataAdapter کلاس

دستوری که در این خاصیت DataAdapter ، داده های مورد نیاز برنامه از بانک اطلاعاتی ب ه کار م ی رود. به عبارت دیگ ر

قرار DataTable و یا DataSet نگهداری می شود را روی بانک اطلاعاتی اجرا کرده و نتایج آن را در کلا س هایی مانند

دارای خاص  یت هایی به نام Datadapter می دهد تا در برنام ه ها مورد استفاده قرار گیرن د . علاوه بر این کلاس

را قبول SqlCommand است که هر یک شی ئ ی از نوع UpdateCommand و InsertCommand ،DeleteCommand

از دستور ذخیره شده در هر یک از آنها به ترتیب برای حذف ،درج و یا ویرایش داد ه ها در بانک DataAdapter می کنند و

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

با استفاده از دستورات موجود در این خاصی ت ها تغ ییرات ما را از داد ه های حافظه به داد ه های DataAdapter ، می کنیم

موجود در بانک اطلا عاتی منتقل م ی کند. ممکن است ابتدا این موارد کمی پیچیده به نظر برسند، اما استفاده از آنها مانند

تمام قسمتهای دیگری که تاکنون مشاهده کرد ه ایم ساده هستن د . در قسم ت های قبل مشاهده کردید که چگونه م ی توان

مورد نیاز را برای انتخاب داد ه ها از بانک اطلاعاتی ایجاد کر د . برای تکمیل دستورات مورد نیاز برای کلاس SELECT دستورات

کلاسی به نام VS مورد نظر خود را وارد کنید. در SELECT نیز فقط کافی است که دستور DataAdapter

و یا UPDATE،INSERT وارد شده، دستورات SELECT وجود دارد که می تواند بر اساس دستور CommandBuilder

و نحوه ی استفاده از آن را برسی SelectCommand مناسب تولید کن د . بنابراین بهتر است که ابتدا با هم خاصیت DELETE

دستورات دیگر را نیز تولید کرد. CommandBuilder کنیم. سپس مشاهده خواهیم کرد که چگونه می توان با استفاده از

SelectCommand خاصیت

برای دریافت DataAdapter در کلاس SelectCommand 1 نیز نشان داده شده است، خاصیت - همانطور که در شکل 23

به کار می رود. DataSet داده های مورد نیاز در برنامه از بانک اطلاعاتی و قرار دادن آنها در

1- شکل 23

mohsen_mahyar@yahoo.com - C# برنامه نویسی

410

اطلاعات مورد نیاز را از یک بانک اطلاعاتی دریافت کنید ، ابتدا باید DataAdapter هنگامی که بخواهید با استفاده از کلاس

دریافت کرده که SqlCommand تنظیم کنید . این خاصیت شی ئ ی از نوع DataAdapter را در SelectCommand خاصیت

این ش ی مشخص م ی کند داد ه ها چگونه باید از بانک اطلاعاتی انتخاب و نیز چه داد ه هایی باید انتخاب شون د . اشیایی که از

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

باید آنها را تنظیم کرد. این خاصیت عبارتند از:

در این قسمت قرار گرفته و نحو ه ی اتصال به بانک اطلاعاتی SqlConnection یک شیی از کلاس :Connection •

را مشخص می کند.

و یا نام پروسیجر ذخیره شده در بانک اطلاعاتی که باید ت وسط شی اجرا شود ، در این SQL دستور :CommandText •

قسمت ذخیره می شود.

استفاده کردی م . اما اگر SqlCommand از کلاس CommandText مشخص در خاصیت SQL در قسمت قبل از یک دستور

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

قرار دهیم تا StoredProcedure تنظیم کرده و مقدار آن را برابر با SqlCommand را نیز در کلاس CommandType نام

البته در این فصل فقط .SQL نام یک پروسیجر ذخیره شده است ، نه یک دستور CommandText مشخص شود که متن درون

را تغییر CommandType استفاده م ی کنیم، بنابراین نیازی نیست که خاصیت CommandText در خاصیت SQL از دستورات

داده و برابر با مقدار خاصی قرار دهیم.

SQL با استفاده از دستور SelectCommand تنظیم خاصیت

به وسیل ه ی کلاس SQL قطعه کدی که در زیر آورده شده است نحو ه ی تنظیم خاصی ت های مورد نیاز برای اجرای یک دستور

را نمایش می دهد: DataAdapter

// Declare a SqlDataAdapter object...

SqlDataAdapter objDataAdapter = new SqlDataAdapter();

// Assign a new SqlCommand to the SelectCommand property

objDataAdapter.SelectCommand = new SqlCommand();

// Set the SelectCommand properties...

objDataAdapter.SelectCommand.Connection = objConnection;

objDataAdapter.SelectCommand.CommandText =

"SELECT au_lname, au_fname FROM authors " +

"ORDER BY au_lname, au_fname";

ADO.NET با SQL Server فصل بیست و سوم استفاده از بانک اطلاعاتی

411

ایج اد کنیم . سپس باید SqlDataAdapter اولین کاری که باید در این قسمت انجام دهیم این است که شی ئ ی را از نوع

را به آن SqlCommand آن را تنظیم کنی م . برای تنظیم این خاصیت باید یک شیئ از کلاس SelectCommand خاصیت

آن را انجام م ی دهیم تا بتواند به Connection نسبت دهیم، بنابراین شیئی را از این کلاس ایجاد کرده و تنظیمات مربوط به

قرار م ی دهیم تا آن را SQL آن را نیز برابر با یک دستور CommandText یک بانک اطلاعاتی متصل شو د . در آخر نیز خاصیت

روی بانک اطلاعاتی اجرا کرده و نتیجه را دریافت کند.

با استفاده از پروسیجر ذخیره شده SelectCommand تنظیم خاصیت

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

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

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

آن را ،SQL در بانک اطلاعاتی وجود دارد که م ی خواهیم به جای استفاده از دستور usp_select پروسیجری به نام

فراخوانی کرده و نتایج اجرای آن را دریافت کنیم. قطعه کد زیر نحو هی انجام این کار را نمایش م یدهد:

// Declare a SqlDataAdapter object...

SqlDataAdapter objDataAdapter = new SqlDataAdapter();

// Assign a new SqlCommand to the SelectCommand property

objDataAdapter.SelectCommand = new SqlCommand();

// Set the SelectCommand properties...

objDataAdapter.SelectCommand.Connection = objConnection;

objDataAdapter.SelectCommand.CommandText = "usp_select";

objDataAdapter.SelectCommand.CommandType =

CommandType.StoredProcedure;

CommandText را در خاصیت SQL همانطور که مشاهده م ی کنید در این قطعه برنامه ، برخلاف قسمت قبل که یک دستور

قرار می دادیم، از نام یک پروسیجر ذخیره شده استف ا ده کردی م . پس باید به نحوی مشخض کنیم که متن داخل

برای تعیین نوع متن موجود در این خاصیت ، باید .SQL نام یک پروسیجر ذخیره شده است، نه یک دستور CommandText

است که مشخص CommandType.Text استفاده کنی م . مقدار پیش فرض این خاصیت برابر با CommandType از خاصیت

است. در این قطعه کد، این مقدار را تغییر داده و برابر با SQL می کند م تن موجود یک دستور

نام یک CommandText قرار م ی دهیم تا مشخص شود مقدار موجود در خاصیت CommandType.StoredProcedure

پروسیجر ذخیره شده است.

دیگر SQL برای ایجاد دستورات CommandBuilder استفاده از

می توانیم داده های مورد نیاز در برنامه را از بانک DataAdapter موجود در کلاس SelectCommand با استف اده از خاصیت

در حافظه قرار دهی م . سپس در طول برنامه م ی توانیم به کاربر اجازه دهیم تا DataSet اطلاعاتی استخراج کرده و در یک

تغییرات مورد نظر خود را در داد ه های موجود د ر حافظه ایجاد کرده و بعد از اتمام آنها، این تغییرات را به داد ههای موجود در

مورد نیاز برای درج ، حذف و یا ویرایش داد ه های دریافتی را به SQL بانک منعکس کنی م . برای این کار لازم است که دستورات

اضافه کنیم تا این کلاس بتواند با استفاده از این دس ت ورات، تغییرات ایجاد شده را در بانک اطلاعاتی DataAdapter کلاس

وارد کند.

تسلط بیشتری داشته باشیم. خوشبختانه روش ساده تری هم برای SQL اما برای ایجاد این دستورات لازم است که به زبان

که برای SELECT است که م ی تواند با توجه به دستور CommandBuilder انجام این کار وجود دارد و آن استفاده از کلاس

مناسب تولید کن د . قطعه کد زیر نحو ه ی استفاده DELETE و نیز UPDATE ،INSERT وارد کرد ه ایم، دستورات DataAdapter

از این دستورات را نمایش م یدهد.

// Declare a SqlDataAdapter object...

SqlDataAdapter objDataAdapter = new SqlDataAdapter();

// Assign a new SqlCommand to the SelectCommand property

objDataAdapter.SelectCommand = new SqlCommand();

mohsen_mahyar@yahoo.com - C# برنامه نویسی

412

// Set the SelectCommand properties...

objDataAdapter.SelectCommand.Connection = objConnection;

objDataAdapter.SelectCommand.CommandText = "usp_select";

objDataAdapter.SelectCommand.CommandType =

CommandType.StoredProcedure;

// automatically create update/delete/insert commands

SqlCommandBuilder objCommandBuilder =

new SqlCommandBuilder(objDataAdapter);

به بانک اطلاعاتی به صورت DataSet با استفاده از این کلاس ، دستورات لازم برای منعکس کردن تغییرات ایجاد شده از

اتوماتیک نوشته م ی شود. در ادامه ی فصل با نحو ه ی انجام این کار بیشتر آشنا خواهیم شد، اما فعلا بهتر است ببینیم که

در حافظه قرار داد. DataSet چگونه می توان داده ها را از یک بانک اطلاعاتی استخراج کرده و در یک

Fill متد

را در بانک SelectCommand موجود در خاصیت SQL می توانید دستور DataAdapter در کلاس Fill با استفاده از متد

در حافظه قرار دهی د . البته قبل DataSet اطلاعاتی اجرا کرده ، و سپس داد ه های برگشتی از اجرای این دستور را درون یک

ایجاد کنیم. DataSet از استفاده از این متد، باید شیئی از نوع

// Declare a SqlDataAdapter object...

SqlDataAdapter objDataAdapter = new SqlDataAdapter();

// Assign a new SqlCommand to the SelectCommand property

objDataAdapter.SelectCommand = new SqlCommand();

// Set the SelectCommand properties...

objDataAdapter.SelectCommand.Connection = objConnection;

objDataAdapter.SelectCommand.CommandText = "usp_select";

objDataAdapter.SelectCommand.CommandType =

CommandType.StoredProcedure;

DataSet objDataSet = new DataSet();

داده ها ی Fill مورد نیاز را ایجاد کردیم ، می توانیم با استفاده از متد DataAdapter و نیز DataSet حال که یک شی

نیز همانند بسیاری از متدهای دیگر دارای نسخ ه های گوناگونی است ، Fill قرار دهی م . متد DataSet بانک اطلاعاتی ر ا در

اما یکی از پرکاربردترین آنها به صورت زیر مورد استفاده قرار می گیرد:

SqlDataAdapter.Fill(DataSet, String);

String ای است که باید داد ه ها در آن قرار بگیرن د . پارامتر DataSet در این متد مشخص کنند ه ی نام DataSet پارامتر

ها نیز م ی توانند همانند بان ک های DataSet . نیز نام جدولی را مشخص م ی کند که داد ه ها در آن جدول قرار م ی گیرند

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

مشخص کنیم که نام جدولی که داد ه ها در آن قرار م ی گیرند چه باید باشد؟ در اینجا م ی توانیم هر نام که تمایل داشته باشیم

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

درک برنامه بسیار راحت تر خواهد بود.

در Fill قطعه کد زیر یک پروسیجر ذخیره شده در بانک اطلاعاتی را اجرا کرده و نتایج برگشتی از آن را به وسیل ه ی متد

قرار می دهد: ObjDataSet در authors جدولی به نام

// Declare a SqlDataAdapter object...

SqlDataAdapter objDataAdapter = new SqlDataAdapter();

// Create an instance of a new select command object

objDataAdapter.SelectCommand = new SqlCommand();

// Set the SelectCommand properties...

objDataAdapter.SelectCommand.Connection = objConnection;

objDataAdapter.SelectCommand.CommandText = "usp_select";

objDataAdapter.SelectCommand.CommandType =

CommandType.StoredProcedure;

DataSet objDataSet = new DataSet();

// Fill the DataSet object with data...

objDataAdapter.Fill(objDataSet, "authors");

ADO.NET با SQL Server فصل بیست و سوم استفاده از بانک اطلاعاتی

413

قرار دارد استفاده SelectCommand ای که در خاصی ت Connection برای اتصال به بانک اطلاعاتی از شی Fill متد

به بانک اطلاعاتی برقرار است یا ن ه . در صورتی که اتصال Connection می کند. این متد ابتدا بررسی م ی کند که این اتصال

با بانک اطلاعاتی را Connection داده های مورد نیاز را از بانک اطلاعاتی بدست آورده ، اما اتصال Fill برقرار باشد، متد

ارتباط را Open با فراخوانی متد Fill با بانک اطلاعاتی قطع باشد، متد Connection قطع نمی کند. اگر هم ارتباط ش ی

را فراخوانی م ی کند تا اتصال به بانک اطلاعاتی مجدداً Close برقرار کرده و پس از بدست آو ر دن اطلاعات مورد نیاز ، متد

قطع شود.

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

وجود ندار د . دلیل این مورد هم این است که این کلاس متعلق به فضای نام Sql کلمه ی DataSet کنید که ابتدای کلاس

به Dataset قرار دار د . به عبارت دیگ ر ، کلاس System.Data نیست بلکه در فضای نام System.Data.SqlClient

ت علق ندارد و وظیف ه ی آن نگهداری اطلاعات به دس ت OleDb یا SqlClient سرویس دهند ه ی اطلاعاتی خاصی از قبیل

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

از کجا به دست آمد هاند ( تا زمانی که بخواهیم آنها را دوباره در بانک اطلاعاتی قرار دهیم ).

DataSet -5 کلاس -2-23

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

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

کلاس خود همانند یک موتور بانک اطلاعاتی کوچک عمل م ی کند که می تواند داده ها را درون خود در جدولی مجزا نگهداری

پرس وجوهایی را روی داد ه های DataView کرده و به کاربر اجازه دهد که آنها را ویرایش کن د . همچنین با استفاده از کلاس

موجود در آن اجرا کرد.

داده هایی که در این کنترل قرار دارند از بانک اطلاعاتی قطع هستن د ، ارتباطی با بانک ندارند . در طول برنامه م ی توانیم

داده های موجود در آن را حذف کرده، ویرایش یا اضافه کنیم و بعد از اتمام تغییرات مورد نظر ، مجدداً با استفاده از

به بانک اطلاعاتی متصل شده و تغییرات را در بانک اطلاعاتی ذخیره کنیم. DataAdapter

برای ذ خ یره داده ها استفاده م ی کند. به این ترتیب م ی توانید داد ه های موجود در یک شیئ از XML از ساختار DataSet کلاس

را به سادگی در یک فایل ذخیره کرده و یا آن را با استفاده از شبکه به کامپیوتر دیگری منتقل کنی د . البته DataSet کلاس

رفتار کنی د . بلکه کافی است تمام کارهای مورد نظر XML لازم نیست با آنها در قالب DataSet هنگام برنامه نویسی و کار با

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

کرد.

را شرح XML نیز دارای یک الگو است (فایلی که ساختار داده های درون یک یا چند فایل DataSet یک ،XML مانند هر سند

ایجاد XSD را به برنامه اضافه کردیم، فایلی با پسوند DataSet می دهد). در فصل قبل هنگامی که با استفاده از ویزارد یک

. ( 2- در آن قرار گرفت(شکل 23 DataSet شد و الگوی

mohsen_mahyar@yahoo.com - C# برنامه نویسی

414

2- شکل 23

به وسیل ه ی این فای ل ، VS . نگهداری م ی شد CustomerDataSet اطلاعاتی بود که به وسیل ه ی XML این فایل حاوی الگوی

مشتق م ی کند تا بتواند داد ه های دریافت شده از بانک اطلاعاتی را در شی ئ ی از آن کلاس DataSet کلاسی را از کلاس

انجام می شود. DataSet نگهداری کند. البته تمام این موارد نیز از دید برنام هنویس دور می ماند و به صورت درونی توسط

را به کنتر ل های درون فرم متصل کنیم ، تا آن کنتر ل ها داده های DataSet همچنین می توانیم فیلدهای درون یک جدول از

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

این مورد صحبت خواهیم کرد.

DataView -6 کلاس -2-23

عموماً برای جستجو، مرتب کردن، فیلترکردن، ویرایش کردن و یا حرکت کردن در بین داد ه های درون DataView کلاس

یک کنترل قابل اتصال است، یعنی همانطور که م ی توان DataView مورد استفاده قرار م ی گیرد. کنترل DataSet یک

نیز متصل کر د . در این مورد در ادامه فصل DataView متصل کرد، می توان آنها را به یک DataSet کنترل ها را به یک

بیشتر صحبت خواهیم کرد.

می تواند شامل چندین جدول باشد که هر یک از آنها به وسیل ه ی یک کنترل DataSet همانطور که گف ت یم یک کنترل

قرار DataSet داده هایی را درون یک DataAdapter مشخص می شود. در حقیقت هنگامی که با استفاده از DataTable

و سپس داد ه ها را درون آن قرار ( DataTable می دهید، ابتدا یک جدول جدید ایجاد کرده (یک شیئ جدید از نوع

انجام م ی دهد این است که به شما اجازه م ی دهد به DataView اضافه م ی کنید. کاری که کنترل DataSet می دهید و به

نگاه کن ی د. برای مثا ل ، آنها را به صورت مرتب شده مشاهده DataSet صورتی که تمایل دارید به داد ه های یکی از جداول

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

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

LastName وجود داشته باشد که براساس DataSet در authors نمایش آنها را تغییر دهی د . برای مثال ، اگر جدولی به نام

را به گون ه ای ایجاد کنید که حاوی همان اطلاعا ت باشد، اما آنها را ابتدا براساس DataView مرتب شده است ، می توانید یک

از LastName ایجاد کنید که فقط فیلد DataView مرتب کند و یا حتی م ی توانید یک LastName و سپس FirstName

را نمایش دهد و . . . FirstName را نمایش دهد و یا فقط فیلد authors جدول

را به گون ه ای دیگر مشاهده DataTable اطلاعات درون یک DataView البته با وجود اینکه م ی توانید به وسیل ه ی کلاس

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

باید نام جدولی که م ی خواهیم به آن متصل شود را در متد سازند ه ی آن مشخص ،DataView برای ایجا یک ش ی از کلاس

متصل م ی شود . ObjDataSet از authors ایجاد شده و به جدول DataView کنیم. در قطعه ک د زیر، یک شی از کلاس

ADO.NET با SQL Server فصل بیست و سوم استفاده از بانک اطلاعاتی

415

به همراه نام جدول مورد نظر DataSet در کلاس Tables دقت کنید که برای دسترسی به یک جدول خاص از خاصیت

استفاده کرده ایم.

// Set the DataView object to the DataSet object...

DataView objDataView = new

DataView(objDataSet.Tables("authors"));

Sort خاصیت

متصل کردید، م ی توانید نحو ه ی DataSet ایجاد کرده و آن را به یک جدول درون DataView هنگامی که یک شی از نوع

نمایش داده ها را تغییر دهی د . برای مثال تصور کنید که م ی خواهید داده های درون جدول را به گون ه ای متفاوت مرتب کنی د .

استفاده کرده و مقدار آن را برابر با نام ستون و یا ستو ن هایی DataView در کلاس Sort برای این کار م ی توانید از خاصیت

ای ک ه DataView را به وسیل ه ی authors قرار دهید که م ی خواهید داده ها براساس آنها مرتب شون د . قطعه کد زیر جدول

مرتب می کند: LastName و FirstName در قسمت قبل ایجاد کردیم، براساس

objDataView.Sort = "au_fname, au_lname";

ORDER BY همانطور که مشاهده می کنید عبارتی که به این خاصیت نسبت داده م یشود، همانند عبارتی است که در مقابل

تمام مرت ب سازی ها به طور ،SELECT وارد م ی کردیم. در این قسمت نیز همانند دستور SQL زبان SELECT در دستور

پیش فرض به صورت صعودی انجام م ی شوند و برای اینکه بتوانیم ترتیب مرتب شدن آنها را به نزولی تغییر دهیم ، باید در

را براساس authors استفاده کنی م . برای مثال ، قطعه کد زیر ، داده های موجود در جدول DESC مقابل نام ستون از عبارت

به صورت نزولی مرتب می کند: lastName به صورت صعودی و فیلد FirstName فیلد

objDataView.Sort = "au_fname,au_lname DESC";

RowFilter خاصیت

می توانید داده های موجود در یک جدول را فیلتر کن ی د، به گونه ای که DataView علاوه بر مرتب کردن داد ه ها، با استفاده از

در SELECT از دستور WHERE فقط داده هایی که دارای شرایط خاصی هستند نمایش داده شون د . این امکان همانند قسمت

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

استفاده کرده و شرط موردنظر خود را در آن قرار دهی د . نحوه ی وارد کردن دستورات در این قسمت RowFilter خاصیت

است . فقط توجه داشته باشید ، به علت اینکه کل عبارت SELECT از ذستور WHERE نیز همانند وارد کردن شر ط ها در قسمت

شرط باید درون علامت " قرار بگیرند، پس اگر بخواهید رشت ه ای را در شرط م شخص کنید باید آن را درون علامت ' قرار

است نمایش م یدهد: Green آنها برابر با LastName فقط افرادی را که authors دهید. برای مثال، قطعه کد زیر در جدول

// Set the DataView object to the DataSet object...

DataView objDataView = new

DataView(objDataSet.Tables("authors"));

objDataView.RowFilter = "au_lname = 'Green'";

است را بر می گرداند: Green آنها مخالف LastName افرادی که authors و یا قطعه کد زیر در جدول

// Set the DataView object to the DataSet object...

DataView objDataView = new

DataView(objDataSet.Tables("authors"));

objDataView.RowFilter = "au_lname <> 'Green'";

چندین شرط را با یکدیگر OR یا AND به علاوه در شزطی که در این قسمت وارد م ی کنید می توانید با استفاده از عبارات

افرادی را authors ترکیب کرده و سپس داد ه ها را بر اسا س شرط نهایی نمایش دهی د . برای مثال ، قطعه کد زیر در جدول

باشد: Green آنها نیز برابر با LastName شروع شده و D آنها با حرف FirstName نمایش می دهد که

objDataView.RowFilter =

"au_lname <> 'Green' AND au_fname LIKE 'D*'";

mohsen_mahyar@yahoo.com - C# برنامه نویسی

416

Find متد

استفاده کنی د . DataView در کلاس Find برای پیدا کردن یک رکورد خاص از اطلاعات در بانک اطلاعات ی ، می توانید از متد

البته قبل از فراخوانی این متد ، باید داد ه های جدول را بر حسب فیلدی که م ی خواهید جستجو را براساس آن انجام دهید

باید داد ههای موجود در جدول را براساس ستونی که حاوی ک ل ید ،Find مرتب کنید . به عبارت دیگر قبل از فراخوانی متد

مورد نظر شماست مرتب کنید.

به authors که در قسمت قبل ایجاد کردیم، در جدول ObjDataView برای مثال ، تصور کنید که م ی خواهید با استفاده از

au_fname باشد . برای این کا ر ، ابتدا باید جدول را براساس فیلد Ann آن برابر با FirstName دنبال رکوردی بگردید که

بگردید. قطعه کد زیر روش انجام این کار را نمایش م یدهد: Ann به دنبال Find مرتب کنید، سپس با استفاده از متد

int intPosition;

objDataView.Sort = "au_fname";

intPosition = objDataView.Find("Ann");

باشد و شمار ه ی مکان آن را بر Ann آن برابر با FirstName در جدول به نام فردی م ی گردد که DataView به این ترتیب

اولین Find می گرداند. اگر چنین فردی در جدول پیدا نشد ، این مقدار تهی را بر م ی گرداند. دقت کنید به محض اینکه متد

گزینه را پیدا کرد ، مکان آن را برگردانده و از جستجوی ادام ه ی جدول صرفنظر می کند، بنابراین اگر می دانید که بیش از یک

فرد با این نام در جدول وجود دارد برای مشاهده تمام آنها می توانید از روش فیلتر کردن که توضیح داده شد استفاده کنید.

و یا . . باشد را برم یگرداند. ANN و یا Ann همجنین این متد به کوچکی و یا بزرگی حروف حساس نیست و هر فردی که نام او

البته دقت کنید که ا ی ن متد دقیقاً به دنبال متنی که وارد شده است برم ی گردد. بنابراین باید تمام کلمه و یا کلماتی که

می خواهید جستجو براساس آن انجام گیرد را به صورت دقیق در این قسمت وارد کنی د . برای مثال ، اگر م ی خواهید در جدول

بفرستید و انتظار Find را به عنوان پارامتر به متد Del بگردید، نمی توانید Del Castillo به دنبال فردی با نام خانوادگی

داشته باشید که این نام را برای شما برگرداند. بلکه باید نام کامل او را در این قسمت وارد کنید، همانند دستور زیر:

objDataView.Sort = "au_lname";

intPosition = objDataView.Find("del castillo");

می توان یک جدول را براساس چند فیلد مرتب کر د . همین مورد DataView در قسمت قب ل مشاهده کردید که با استفاده از

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

ایجاد م ی کنید و سپس مقدار مورد نظر برای هر ستون را در آن قرار Object کار، بعد از مرتب کردن جدول ، آرایه ای از نوع

می فرستید. برای مثال ، اگر بخواهیم ببینیم که آیا فردی با نام Find می دهید. سپس این آرایه را به عنوان پارامتر به متد

در جدول وجود دارد یا نه. می توانیم از قطعه کد زیر استفاده کنیم: Watts و نام خانوادگی Simon

int intPosition;

Object[] arrValues = new Object[1];

objDataView.Sort = "au_fname, au_lname";

// Find the author named “Simon Watts”.

arrValues[0]= "Simon";

arrValues[1] = "Watts";

intPosition = objDataView.Find(arrValues);

فرستاده شو د . دلیل این امر هم در این Find به متد object نکته: دقت کن ید که در این قسمت حتماٌ باید آرای ه ای از نوع

مشتق م ی شوند. بنابراین اگر بخواهیم آرای ه ای داشته باشیم که هر object تمام نو ع های داده ای از کلاس NET. است که در

تعریف کنیم. در اینجا نیز لازم است آرای های داشته باشیم که object متغیری را بتوانیم در آن قرار دهیم، باید آن را از نوع

را به authors بتوانیم متغیری از هر نوع داد ه ای را در آن قرار دهی م . برای مثال، فرض کنید بخواهید جستجو در جدول

است را پیدا کن د . در این صورت، باید یک Ann گونه ای تغییر دهید که افرادی که سن آنها بالاتر از 25 و نیز نام آنها برا بر

متغیر از نوع عددی و یک متغیر از نوع رشت های را در آرایه قرار دهید.

ADO.NET با SQL Server فصل بیست و سوم استفاده از بانک اطلاعاتی

417

در عمل ADO.NET -3-23 استفاده از کلا سهای

آشنا شدیم و مشاهده کردیم که چگونه م ی توان داده ها را به وسی ل ه این ADO.NET تاکنون با اصول کار کلا س های موجود در

بدست آورده و یا در آنها وارد کرد. اما تا این قسمت از فصل فقط ذهن خود را با SQL SERVER کلاس ها از بانک اطلاعاتی

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

را درست درک کرد ه ایم ، بهت ر ین را ه این است که از آنها در یک مثال عملی استفاده کنی م . در دو مثال بعدی با استفاده از

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

اس تفاده کرده و DataSet و نیز SqlCommand ،SqlConnection ،SqlDataAdapter در مثال اولی از کلا سهای

نمایش DataGrid بوسیله آنها یک برنامه ساده ایجاد م ی کنیم که داد ه ها را از یک بانک اطلاعاتی بدست آورد و در یک

دهد. در واقع برنام ه ای که در این قسمت خواهیم نوشت، عملکردی بسیار مشابه برنامه فصل قبل خواهد داش ت . البته با این

تفاوت عمده که در این قسمت به جای استفاده از ویزارد، از کد نویسی استفاده خواهیم کرد.

نکته: هنگام نوشتن برنام ه های واقعی، معمولاً از ویزارد و کدنویسی به صورت همزمان استفاده م ی کنند تا بتوانند به سرعت و

به راحتی برنام ه هایی با انعطا ف پذیری بالا ایجاد کنن د . کنترل هایی که در قسمت قبل با استفاده از جعبه ابزار به فرم اضافه

کردیم را در این قسمت با استفاده از کد ایجاد خواهیم کر د . البته نحوه استفاده آنها در هر دو روش یکسان خواهد بو د .

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

کرد.

در برنامه DataSet -1 کاربرد -3-23

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

2000 استخراج SQL Server در pubs نمایش دهیم و نیز رابطه ی بین آنها بپردازیم. اطلاعات این برنامه از بانک اطلاعاتی

2000 استفاده می کنید نیز باید همین اطلاعات را SQL Server به جای msde 7 و یا ، می شود. البته اگر از نسخه های 2005

مشاهده کنید. pubs در بانک اطلاعاتی

این بانک اطلاعاتی مربوط به یک انتشارات فرضی اس ت . در این برنامه می خواهیم لیستی از نویسندگان، کتابهایی که تاک نون

3 این جدو ل ها ر ا به همراه فیلدهای موجود در هر کدام و نیز - چاپ کرده اند و قیمت هر کدام را نمایش دهی م . در شکل 23

رابطه های بین آنها را نمایش م یدهد.

بدس  ت authors همانطور که در شکل مشاهده م ی کنید در این برنامه م ی خواهیم نام و نام خانوادگی نویسنده را از جدول

قرار دار د ، در برنامه نمایش دهی م . به علت اینکه یک کتاب titles آورده و به همراه عنوان و قیمت کتاب او که در جدول

می تواند بیش از یک نویسنده داشته باشد و نیز یک نویسنده نیز م ی تواند بیش از یک کتاب نوشته باشد ، اطلاعات این دو

به یکدیگر متصل شد هاند. titleauthor جدول در جدول دیگری به نام

3- شکل 23

mohsen_mahyar@yahoo.com - C# برنامه نویسی

418

ای که باید در این مورد SELECT با توجه به رابط ه ی بین جدول و نیز اطلاعاتی که م ی خواهیم از آنها استخراج کنی م ، دستور

استفاده کنیم مشابه زیر خواهد بود:

SELECT au_lname, au_fname, title, price

FROM authors

JOIN titleauthor ON authors.au_id = titleauthor.au_id

JOIN titles ON titleauthor.title_id = titles.title_id

ORDER BY au_lname, au_fname

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

titles و نیز authors نام جدول اصلی است که داد ه ها از آن استخراج م ی شوند. در این قسمت داد ه ها از دو جدول

را به عنوان جدول اصلی در نظر م یگیریم. authors استخراج می شوند، اما جدول

رابطه برقرار م ی کند. به این titleauthor و نیز همین ستون در جدول authors در جدول au_id خط سوم بین ستون

که مقدار titleauthor انتخاب شود ، تمام رکورد های موجود در جدول authors ترتیب هر زمان که یک رک و رد از جدول

باشد نیز انتخاب خواهند شد. authors آنها برابر با مقدار این ستون در رکورد انتخاب شده از جدول au_id ستون

رابطه برقرار title_id از طریق ستون titleauthor و جدو ل titles خط چهارم نیز مانند خط سوم، بین جدول

انتخاب شود، رکوردهای متناظر آن در جدو ل titleauthor می کند. به این ترتیب هر زمان که یک رکورد از جدو ل

نیز انتخاب خواهند ش د . خط آخر نیز اطلاعات را براساس نام خانوادگی و سپس نام ، به صورت صعودی مرتب titles

می کند.

برای درک آن کافی نباشد، اما در هر صورت برای اتمام این مثال کافی SELECT نکته: ممکن است که توضیحات این دستور

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

پیچیده ای برای انتخاب داد ه ها از چندین جدول SELECT اطلاعاتی رابطه ای را درک کرده باشید و نیز بتوانید د س تورات

بنویسید. بنابراین در این صورت بهتر است که کتاب هایی را در این زمینه نیز مطالعه کنید.

1- مثال 23

ایجاد کنید. DATASETEXAMPLE یک برنامه ی ویندوزی جدید به نام VS 1)با استفاده از

خاصی تهای فرم را به صورت زیر تغییر دهید: ،Properties 2)با استفاده از پنجره ی

600 قرار دهید. / را برابر با 230 Size خاصیت

ADO.NET با SQL Server فصل بیست و سوم استفاده از بانک اطلاعاتی

419

قرار دهید. CenterScreen را برابر با StartPosition خاصیت

قرار دهید. Bound DataSet را برابر با Text خاصیت

به فرم برنامه اضافه کرده و خاصی ت های آن را به DataGridView در جعبه ابزار،یک کنترل Data 3)با استفاده از قسمت

صورت زیر تغییر دهید:

قرار دهید. grdAuthorTitles را برابر با Name خاصیت

قرار دهید. Top/Left/Right/Bottom را برابر با Anchor خاصیت

0 قرار دهید. / را برابر با 0 Location خاصیت

592 قرار دهید. / را برابر با 203 Size خاصیت

1 را باز کرده و ابتدا فضای نا مهایی که در طول برنامه به آنها نیاز خواهیم داشت را به Form 4)ویرایشگر کد مربوط به کلاس

1 اضافه کنید: Form برنامه اضافه کنید. برای این کار دستور زیر را به بالای تعریف کلاس

// Using Data and SqlClient namespaces...

using System.Data;

using System.Data.SqlClient;

public partial class Form1 : Form

{

}

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

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

به درستی وارد شده است. ConnectionString

public partial class Form1 : Form

{

SqlConnection objConnection = new SqlConnection(

"server=localhost;database=pubs;" +

"user id=sa;password=");

SqlDataAdapter objDataAdapter = new SqlDataAdapter();

DataSet objDataSet = new DataSet();

public Form1()

{

نکته: دقت کنید که اگر سرور بانک اطلاعاتی که از استفاده م ی کنید در کامپیوتر دیگری به غیر از کامپیوتری که در حال

تغییر دهید . همچنین SQL Server را به نام کامپیوتر حاوی Server استفاده از آن هستید قرار دارد، باید مقدار پارامتر

را نیز به گونه ای تنظیم کنید که به یک نام کاربری و کلم هی عبور مناسب در سرور Password,User ID باید مقدار پارامتر

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

ذکر کنید اما در مقابل آن ConnectionString را Password که در سرور تعریف کرد ه اید کلمه عبور ندارد ، باید قسمت

.;=Password چیزی ننویسید. برای مثال

فرم به load برگردید و روی نوار عنوان آن دو بار کلیک کنید تا متد مربوط به روی  داد Forml 6)به قسمت طراحی فرم

صورت اتوماتیک ایجاد شود. سپس کد مشخص شده در زیر را به این متد اضافه کنید:

private void Form1_Load(object sender, EventArgs e)

{

// Set the SelectCommand properties...

objDataAdapter.SelectCommand = new SqlCommand();

objDataAdapter.SelectCommand.Connection =

objConnection;

objDataAdapter.SelectCommand.CommandText =

"SELECT au_lname, au_fname, title, price " +

"FROM authors " +

"JOIN titleauthor ON authors.au_id = " +

"titleauthor.au_id " +

"JOIN titles ON titleauthor.title_id = " +

mohsen_mahyar@yahoo.com - C# برنامه نویسی

420

"titles.title_id " +

"ORDER BY au_lname, au_fname";

objDataAdapter.SelectCommand.CommandType =

CommandType.Text;

// Open the database connection...

objConnection.Open();

// Fill the DataSet object with data...

objDataAdapter.Fill(objDataSet, "authors");

// Close the database connection...

objConnection.Close();

// Set the DataGridView properties

// to bind it to our data...

grdAuthorTitles.AutoGenerateColumns = true;

grdAuthorTitles.DataSource = objDataSet;

grdAuthorTitles.DataMember = "authors";

// Clean up

objDataAdapter = null;

objConnection = null;

}

4 مشاهده خواهید کرد. - 7)با اجرای برنامه، نتیجه ای مشابه شکل 23

4- شکل 23

دارای خاصیت درونی مرتب کردن داد هها است. بنابراین اگر روی یکی از نا م های DataGridView 8)دقت کنید که کنترل

ستون ها کلیک کنید، داد ه های موجود در ف رم براساس آن ستون مرتب م ی شوند. همچنین کلیک دوباره بر روی نام یک

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

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

در برنامه ای که می نویسید این کدها را نیز اضافه کنید.

2- مثال 23

انجام دهید تا داد هها بهتر نمایش داده شوند، آورده شده است: DataGridView -1 در زیر از تغییراتی که می توانید در یک

- عنوان ستون ها را برابر با نام مناسبی قرار دهید.

- اندازه ی هر ستون را به گون های تغییر دهید تا بتوان به راحتی داد ههای آن را مطالعه کرد.

- رنگ هر ردیف از اطلاعات را به گون های تغییر دهید که به صورت متمایز نمایش داده شوند.

- داده ها را در ستو نها به صورت راست - چین قرار دهید ( برای نمایش داده های عددی).

تغییرات مشخص شده در زیر را اعمال کنید: form_Load -2 برای انجام این موارد، در متد

private void Form1_Load(object sender, EventArgs e)

{// Set the SelectCommand properties...

objDataAdapter.SelectCommand = new SqlCommand();

objDataAdapter.SelectCommand.Connection =

objConnection;

objDataAdapter.SelectCommand.CommandText =

ADO.NET با SQL Server فصل بیست و سوم استفاده از بانک اطلاعاتی

421

"SELECT au_lname, au_fname, title, price " +

"FROM authors " +

"JOIN titleauthor ON authors.au_id = " +

"titleauthor.au_id " +

"JOIN titles ON titleauthor.title_id = " +

"titles.title_id " +

"ORDER BY au_lname, au_fname";

objDataAdapter.SelectCommand.CommandType =

CommandType.Text;

// Open the database connection...

objConnection.Open();

// Fill the DataSet object with data...

objDataAdapter.Fill(objDataSet, "authors");

// Close the database connection...

objConnection.Close();

// Set the DataGridView properties

// to bind it to our data...

grdAuthorTitles.AutoGenerateColumns = true;

grdAuthorTitles.DataSource = objDataSet;

grdAuthorTitles.DataMember = "authors";

// Declare and set

// the currency header alignment property...

DataGridViewCellStyle objAlignRightCellStyle = new

DataGridViewCellStyle();

objAlignRightCellStyle.Alignment =

DataGridViewContentAlignment.MiddleRight;

// Declare and set the alternating rows style...

DataGridViewCellStyle objAlternatingCellStyle = new

DataGridViewCellStyle();

objAlternatingCellStyle.BackColor = Color.WhiteSmoke;

grdAuthorTitles.AlternatingRowsDefaultCellStyle =

objAlternatingCellStyle;

// Declare and set the style for currency cells ...

DataGridViewCellStyle objCurrencyCellStyle = new

DataGridViewCellStyle();

objCurrencyCellStyle.Format = "c";

objCurrencyCellStyle.Alignment =

DataGridViewContentAlignment.MiddleRight;

// Change column names

// and styles using the column name

grdAuthorTitles.Columns["price"].HeaderCell.Value =

"Retail Price";

grdAuthorTitles.Columns["price"].HeaderCell.Style =

objAlignRightCellStyle;

grdAuthorTitles.Columns["price"].DefaultCellStyle =

objCurrencyCellStyle;

// Change column names

// and styles using the column index

grdAuthorTitles.Columns[0].HeaderText = "Last Name";

grdAuthorTitles.Columns[1].HeaderText = "First Name";

grdAuthorTitles.Columns[2].HeaderText = "Book Title";

grdAuthorTitles.Columns[2].Width = 225;

// Clean up

objDataAdapter = null;

objConnection = null;

objCurrencyCellStyle = null;

objAlternatingCellStyle = null;

objAlignRightCellStyle = null;

}

را قال ب بندی DataGrid می توانید تنظیمات نمایشی سطر و ستو ن های DataGridViewCellStyle به کمک کلاس

کنید.

5 نمایش داده م ی شوند . با - -3 مجددا برنامه را اجرا کنی د . مشاهده خواهید کرد که داد ه ها در جدولی مشابه شکل 23

4 متوجه تفاوت های ایجاد شده در برنامه خواهید شد - مقایسه ی این شکل با شکل 23

5- شکل 23

mohsen_mahyar@yahoo.com - C# برنامه نویسی

422

-4-23 اتصال داده ها

بهترین کنترل برای نمایش تمام داد ه ها در فرم برنامه اس ت . این کنترل علاوه براین قابلیت م ی تواند DataGridView کنترل

به راحتی به کاربر اجازه دهد که داد ه ها را حذف و یا ویرایش کند و یا داد ه های جدید را در جدول وارد کند. اما با این وجود

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

بر روی فرم قرار داده و هر یک از آنه ا را به یکی از فیلدهای جدول در برنامه TextBox است که تعدادی کنترل ساده مانند

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

می توانید کنترل بیشتری روی داد ه ها داشته باشی د . اما کدی که برای این کار باید در برنامه وارد کنید نیز مشک ل ت ر خواهد

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

برنامه طراحی کنید که به وسیله آن بتوان در بین سطرهای اطلاعات حرکت کر د . بنابراین برای انجام این کار لازم است که

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

در بحث راجع به اتصال داد ه ها، منظور از کنتر ل های ساده کنتر ل هایی هستند که در هر لحظه فقط م ی توانند مقدار یک داده

و یا کنتر ل هایی از این قبیل . RadioButton ،CheckBox ،TextBox را در خود نگهداری کنند، برای مثال مانن د

که در هر لحظه می توانند بیش از یک آیتم از داد ه های DataGridView و یا ListBox ،ComboBox کنترل هایی مانند

موجود در برنامه را نمایش دهند به عنوان کنتر لهای ساده در نظر گرفته نم یشوند.

:CurrencyManager,BindingContext-1-4-23

است که اتصالات کنتر ل های درون فرم را مدیریت م ی کند. بنابراین به علت BindingContext هر فرم دارای شیئی از نوع

اینکه فرم برنامه شما به صورت درونی دارای چنین شیئی است، نیازی نیست که آن را در یک کد ایجاد کنید.

را مدیریت م ی کند . وظیفه ی CurrencyManager در حقیقت یک مجموعه از اشی ا ء از نوع BindingContext شی

متصل هستند و منبع داد ه ای، ( DataSet نیز این است که بین کنتر ل هایی که به منبع داد ه ای ( مثلا CurrencyManager

و نیز این کنتر ل ها با دیگر کنتر ل هایی که در فرم به همان منبع داد ه ای متصل هستند هماهنگی برقرار کن د . به این ترتیب

می توان مطمئن شد که ت مام این کنتر ل ها در فرم در حال نمایش داد ه های موجود در یک سطر هستن د . شی

،DataTable ،DataSet می تواند این هماهنگی را بین کنتر ل ها و منابع داد ه ای مختلفی مانن د CurrencyManager

ایجاد کن د . هر زمان که منبع داد ه های جدید به فرم برنامه اضاف ه کنید، یک ش ی DataSetView ،DataView

جدید نیز به صورت اتوماتیک ایجاد م ی شود. به این ترتیب کار با کنتر لهای متصل به یک منبع CurrencyManager

داده ای در فرم برنامه بسیار ساده خواهد شد.

CurrencyManager اگر در برنام ه ی خود از چندین منبع داد ه ای مختلف استفاده م ی کنید، م ی توانید ی ک متغیر از نوع

ارجاع دهی د . به BindingContext مربوط به منبع داد ه ای مورد نظر خود در CurrencyManager ایجاد کرده و آن را ب ه

ADO.NET با SQL Server فصل بیست و سوم استفاده از بانک اطلاعاتی

423

دسترسی داشته BindingContext مورد نظر خود CurrencyManager این ترتیب به وسیل ه ی این متغیر م ی توانید به

باشید و به وسیل هی آن نمایش داد هها را بر روی فرم کنترل کنید.

ای که در برنام هی قبل ایجاد کرده بودیم، یک ارجاع به شی DataSet قطعه کد زیر با استفاده از شی

را کنترل م ی کرد ایجاد م ی کند. برای این کا ر ، ابتدا یک Authors ای که منبع داد ه ای مربوط به جدول CurrencyManager

مربوط به منبع CurrencyManager ایجاد می کنیم. سپس مقدار این متغیر را برابر با CurrencyManager متغیر از کلا س

ذ خیره BindingContext قرار م ی دهیم. البته دقت کنید شیئی که د ر BindingContext در objDataSet داده ای

CurrencyManager نیست و باید با استفاده از عملکرد ( ) آن را به صورت صریح به CurrencyManager می شود از

تبدیل کنیم:

CurrencyManager objCurrencyManager;

objCurrencyManager =

(CurrencyManager)(this.BindingContext[objDataSet]);

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

رکورد جاری را کنترل کنیم. برای مثال، کد زیر موقعیت رکورد جاری را یک واحد افزایش می دهد:

یک منبع داد ه ای، رکوردی است که تمام کنتر ل های ساده ی فرم که به این CurrencyManager منظور از رکورد جاری د ر

منبع داد های متصل شده اند باید اطلاعات آن رکورد را نمایش دهند.

objCurrencyManager.Position += 1;

متصل شد ه اند، اطلاعات رکورد قبلی را objDataSet و یا دستور زیر باعث م ی شود که تمام کنتر ل های ساده ای که به

نمایش دهند:

objCurrencyManager.Position -= 1;

می توانیم از کد زیر استفاده کنیم: objDataSet همچنین برای نمایش اطلاعات مربوط به اولین رکورد در

objCurrencyManager.Position = 0;

حاوی تعداد رکوردهایی است که در منبع داد ه ای که به وسیل ه ی CurrencyManager در کلاس Count خاصیت

مدیریت م ی شود وجود دار د . بنابراین برای نمایش اطلاعات مربوط به رکورد آخر در فرم برنامه CurrencyManager

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

objCurrencyManager.Position = objCurrencyManager.Count - 1;

دقت کنید که در این کد از تعداد رکور د های موجود منهای یک برای رفتن به آخرین رکورد استفاده کرد ه ایم. دلیل این کار

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

یک خواهد بود.

-2-4-23 اتصال کنترل ها

آن کنترل استفاده کنی م . این خاصیت از کلاس DataBindings برای اتصال یک کنترل به یک منبع داد ه ای ،باید از خاصیت

Add است و خود نیز دارای چندین خاصیت و متد مختلف است . اما در این قسمت از متد DataBindingsCollection

آن استفاده خواهیم کرد. این متد سه پارامتر دریافت کرده و به صورت زیر فراخوانی م یشود:

object.DataBindings.Add(propertyName,

dataSource, dataMember);

این پارامترها برای موارد زیر مورد استفاده قرار می گیرند:

نام کنترلی است که می خواهیم یک اتصال جدید برای آن ایجاد کنیم. :Object

حاوی نام خاصیتی است که م یخواهیم در طول برنامه مقدار خود را از منبع داد های دریافت کند. :propertyName

mohsen_mahyar@yahoo.com - C# برنامه نویسی

424

نام منبع داد ه ای است که م ی خواهیم اطلاعات مورد نیاز برای این کنترل ر ا از آن دریافت ک نیم و م ی توان :dataSource

یا هر منبع داد های دیگری باشد. DataTable ،DataView ،DataSet شامل یک

از propertyName مشخص کننده ی نام فیلدی از منبع داد ه ای است که م ی خواهیم آن را ب ه خاصیت :dataMember

کنترل متصل کنیم.

را به txtFirstName درکنترل Text در قطعه کد زیر آورده شده است.کد زیر خاصی ت Add مثالی ازنحوه استفاده از متد

متصل می کند: objDataView از شی au-fname فیلد

txtFirstName.DataBindings.Add("Text",

objDataView, "au_fname");

در مواقعی ممکن است بعد از ایجاد اتصال د ر یک کنترل بخواهید تمام اتصالات آن با منابع داد های را حذف کنید. برای این

استفاده کنید. این متد تمام اتصالاتی که برای ControlBindingsCollection درکلاس Clear کار می توانید از متد

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

txtFirstName.DataBindings.Clear();

آشنا شدیم . بهتر CurrencgManager و نیز ControlBindingsCollection ،BindingContext حال که با اشیا ی

است نحو هی استفاده از آنها در یک برنامه را نیز مشاهده کنیم.

3-اتصال کنترل های ساده به منبع داد های - مثال 23

ایجاد کنید. BindingExample یک پروژه با نام VS -1 با استفاده از

به فرم اضافه کنی د . این کنترل همانند کنترل های دیگر به قسمت پایین بخش طراحی فرم مربوط ToolTip -2 یک کنترل

1 اضافه خواهد شد. Form به

خاصیت های آن را به صورت زیر Properties -3 بر روی فرم برنامه کلیک کنید تا انتخاب شو د . سپس با استفاده از پنجره

تغییر دهید :

قرار دهید. FixedDialog را برابر FormBorderStyle خاصیت

قرار دهید. False را برابر با maximizeBox خاصیت

قرار دهید. False را برابر با MinimizeBox خاصیت

360 قرار دهید. " را برابر با 430 Size خاصیت

قرار دهید. CenterScreen را برابر با StartPosition خاصیت

قرار دهید. Binding Controls را برابر با Text خاصیت

4) در این قسمت باید کنتر ل هایی را به فرم برنامه اضافه کرده و سپس خاصی ت های مختلف آنها را تنظیم کن ی د تا فرم برنامه

6 شود. - مشابه شکل 23

این مراحل به این دلیل طی م ی شوند تا ظاهر برنامه همانند یک برنام ه ی واقع ی شود . با این وجود ، این مراحل اهمیت زیادی

6 ایجاد کنی د . البته در این صورت - ندارد و در صورت لزوم م ی توانید از آنها صرفنظر کرده و خودتان فرمی را مشابه شکل 23

دقت کنید که اسامی کنتر ل ها باید مشابه آنچه باشد که در این قسمت عنوان شده اس ت . در غیر اینصورت ممکن اس ت در

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

6- شکل 23

ADO.NET با SQL Server فصل بیست و سوم استفاده از بانک اطلاعاتی

425

به فرم برنامه اضافه کرده و خاصی تهای آن را به صورت زیر دهید: GroupBox 5) یک کنترل

را برابر با 128;408 قرار دهید. Size خاصیت o

را برابر با 8;8 قرار دهید. Location خاصیت o

قرار دهید. Authors && Titles را برابر با Text خاصیت o

باید از علامت && استفاده کنی د . استفاده از یک & در GroupBox نکته: برای نمایش علا مت & در عنوان یک کنترل

عنوان باعث می شود که کا راکتر بعد از آن با زیر خط نمایش داده شود.

اضافه کنید: GroupBoxl با خاصی تهایی که در جدول زیر عنوان شده است را به کنترل Label 6 ) چهار کنترل

Name Location Size Text AutoSize

Label1 26;8 16;64 Last Name False

Label2 50;8 16;64 First Name False

Label3 74;8 16;56 Book Title False

Label4 98;8 16;64 Price False

در برنامه اضافه کرده و خاصی ت های آن را بر اساس GroupBoxl نیز ب ه TextBox 7) با استفاده از جعبه ابزار چهار کنتر ل

جدول زیر تنظیم کنید:

Name Location Size ReadOnly

txtLastName 24;72 20;88 True

txtFirstName 48;72 20;88 True

txtBookTitle 72;72 20;328 False

txtPrice 96;72 20;48 False

اسلام احمد زاده - 09177112161 - C# برنامهنویسی

426

دیگری به فرم اضافه کرده و خاصی ت های آن آن را طبق لیست زیر تنظیم GroupBox 8) با استفاد ه از جعبه ابزار کنتر ل

کنید:

را برابر با 144;8 قرار دهید. Location خاصیت

را برابر با 168;408 قرار دهید. Size خاصیت

قرار دهید. Navigation را برابر با Text خاصیت

2 اضافه کرده و بر اساس جدول زیر آنها را تنظیم کنید: GroupBox به Label 9) دو کنترل

Name Location Size Text AutoSize

Label5 23;8 16;64 Field False

Label6 48;8 16;80 SearchCriteria False

،CboField آن را برابر با Name 2 اضافه کنید. خاصیت GroupBox به ComboBox 10 ) با استفاده از جعبه ابزار یک کنترل

را برابر با DropDownStyle را برابر 21;88 و خاصیت Size را برابر با 21;88 ، خاصیت Location خاصیت

قرار دهید. DropDownList

2 اضافه کرده و خاصی تهای آن را براساس جدول زیر تغییردهید: GroupBox به TextBox 11 ) دو کنترل

Name Location Size TabStop TextAlign

txtSearchCriteria 48;88 20;200 - -

txtRecordPosition 130;152 20;85 False Center

2 اضافه کرده و خاصیت های آنها را به صورت زیر تغییردهید: GroupBox به Button 12 )ده کنترل

ToolTip On

ToolTip1

Name Location Size Text

btnPerformSort 16;304 24;96 Perform Sort -

Perform -

Search btnPerformSearch 48;304 24;96

btnNew 88;40 24;72 New -

btnAdd 88;120 24;72 Add -

btnUpdate 88;200 24;72 Update -

btnDelete 88;280 24;72 Delete -

btnMoveFirst 128;88 24;29 >| Move First

Move

Previous

btnMovePrevious 128;120 24;29 >

btnMoveNext 128;200 24;29 < Move Next

btnMoveLast 128;272 24;29 |< Move Last

ADO.NET با SQL Server فصل بیست و سوم استفاده از بانک اطلاعاتی

427

Size و یا Location ،Name به برنامه اضافه کنی د . نیازی به تغییر خاصی تهای StatusStrip 13 )در آخر نیز یک کنترل

را به آن اضافه کنید. StatusLabel این کنترل نیست. بعد از انتخاب این کنترل، با استفاده از منوی کنار آن یک کنترل

6 باشد. - 14 )بعد از اتمام این مراحل، فرم کامل شد هی برنامه باید مشابه شکل 23

رفته و با قرار دادن کد Forml 15 )حال قسمت کدنویسی برنامه را شروع م ی کنیم. به قسمت ویرایشگر کد مربوط به کلاس

را به برنامه اضافه کنید: System.Data.SqlClient و System.Data زیر در بالای کدها، فضای نام

// Import Data and SqlClient namespaces

using System.Data;

using System.Data.SqlClient;

16 )سپس اشیایی که باید به صورت سراسری در برنامه وجود داشته باشند را در ابتدای کلاس تعریف کنی م . همچنین یک

ای که م ی خواهیم در طول برنامه به کار ببریم را در آن قرار م ی دهیم. بنابراین کد زیر SQL رشته ی ثابت تعریف کرده و دستور

اضافه کنید: Forml را به ابتدای کلاس

public partial class Form1 : Form

{

// Constant strings

private const string _CommandText =

"SELECT authors.au_id, au_lname, au_fname, " +

"titles.title_id, title, price " +

"FROM authors " +

"JOIN titleauthor ON authors.au_id = " +

"titleauthor.au_id " +

"JOIN titles ON titleauthor.title_id = " +

"titles.title_id " +

"ORDER BY au_lname, au_fname";

private const string _ConnectionString =

"server=localhost;database=pubs;" +

"user id=sa;password=;";

// Declare global objects...

SqlConnection objConnection;

SqlDataAdapter objDataAdapter;

DataSet objDataSet;

DataView objDataView;

CurrencyManager objCurrencyManager;

را براساس تنظیمات سرور بانک اطلاعاتی خود تغییر ConnectionString ، نکته: قبل از وارد کردن قطعه کد بالا در برنامه

مربوط به حساب کاربری خود را وارد کرده و همچنین اگر سرور روی کامپیوتر دیگری قرار Password-User ID. دهید

نام کامپیوتر سرور در شبکه را وارد کنید. localhost دارد، به جای استفاده از

17 )کد درون متد سازنده ی فرم را به صورت زیر تغییر دهید:

public Form1()

{

objConnection = new SqlConnection(_ConnectionString);

objDataAdapter = new SqlDataAdapter(_CommandText, bjConnection);

InitializeComponent();

}

است . این زیربرنامه به همراه FillDataSetAndView 18 )اولین زیر برنامه ای که باید ایجاد کنیم ، زیربرنامه ای به نا م

بعد از تعربف متغیرها اضافه کنید: ،Forml چند زیربرنام هی دیگر در ابتدای برنامه فراخوانی می شوند.کد زیر را به

private void FillDataSetAndView()

{

// Initialize a new instance of the DataSet object...

objDataSet = new DataSet();

// Fill the DataSet object with data...

objDataAdapter.Fill(objDataSet, "authors");

// Set the DataView object to the DataSet object...

objDataView = new DataView(

objDataSet.Tables["authors"]);

// Set our CurrencyManager object

// to the DataView object...

objCurrencyManager = (CurrencyManager)( this.BindingContext[objDataView]);

}

mohsen_mahyar@yahoo.com - C# برنامه نویسی

428

19 )در این قسمت باید زیر برنام ه ای به فرم اضافه کنیم تا کنتر ل های موجود در فرم را به فیلدهای مربوط به آنها د ر

اضافه کند: DataView

private void BindFields()

{

// Clear any previous bindings...

txtLastName.DataBindings.Clear();

txtFirstName.DataBindings.Clear();

txtBookTitle.DataBindings.Clear();

txtPrice.DataBindings.Clear();

// Add new bindings to the DataView object...

txtLastName.DataBindings.Add("Text",

objDataView, "au_lname");

txtFirstName.DataBindings.Add("Text",

objDataView, "au_fname");

txtBookTitle.DataBindings.Add("Text",

objDataView, "title");

txtPrice.DataBindings.Add("Text",

objDataView, "price");

// Display a ready status...

ToolStripStatusLabel1.Text = "Ready";

}

20 )سپس زیربرنام های به کلاس اضافه می کنیم که موقعیت رکورد جاری را در فرم برنامه نمایش دهد:

private void ShowPosition()

{

// Always format the number

// in the txtPrice field to include cents

try

{

txtPrice.Text =

Decimal.Parse(txtPrice.Text).ToString("##0.00");

}

catch(System.Exception e)

{

txtPrice.Text = "0";

txtPrice.Text =

Decimal.Parse(txtPrice.Text).ToString("##0.00");

}

// Display the current position

// and the number of records

txtRecordPosition.Text =

(objCurrencyManager.Position + 1) +

" of " + objCurrencyManager.Count;

}

21 )تا اینجا زیربرنام ه های لازم را به برنامه اضافه کرد ه ایم، اما در هیچ قسمت از کد از این زیربرنام ه های ایجاد شده استفاده

نکرده ایم.این زیر برنام ه ها لازم است که قبل از نمایش داده شدن فرم و هنگام بارگذاری آن فراخوانی شون د . بنابراین به

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

سپس کد مشخص .(GroupBox کنید که باید در یک قسمت خالی از فرم دو بار کلیک کنید، نه در قسمتی خالی از کنترل

شده در زیر را به این متد اضافه کنید:

private void Form1_Load(object sender, EventArgs e)

{

// Add items to the combo box...

cboField.Items.Add("Last Name");

cboField.Items.Add("First Name");

cboField.Items.Add("Book Title");

cboField.Items.Add("Price");

// Make the first item selected...

cboField.SelectedIndex = 0;

// Fill the DataSet and bind the fields...

FillDataSetAndView();

BindFields();

// Show the current record position...

ShowPosition();

}

ADO.NET با SQL Server فصل بیست و سوم استفاده از بانک اطلاعاتی

429

22 )حال باید کد کلیدهای مربوط به حر ک ت بین رکوردها را در برنامه وارد کنی م . برای این کار لازم است که چهار بار به قسمت

،btnMoveLast ،btnMovePrevious ،btnMoveNext طراحی فرم بروید و روی هر کدام از دکمه های

کلیک کنید تا متد مربوط به رویداد کلیک هر یک از آنها ایجاد شو د . کد مشخص شده در زیر ر ا به متد btnMoveFirst

اضافه کنید: btnMoveFirst کنترل Click مربوط به رویداد

private void btnMoveFirst_Click(object sender, EventArgs e)

{

// Set the record position to the first record...

objCurrencyManager.Position = 0;

// Show the current record position...

ShowPosition();

}

اضافه کنید: btnMovePrevious کنترل Click 23 )کد زیر را به متد مربوط به رویداد

private void btnMovePrevious_Click(object sender,

EventArgs e)

{

// Move to the previous record...

objCurrencyManager.Position -= 1;

// Show the current record position...

ShowPosition();

}

اضافه کنید: btnMoveNext_Click 24 )کد زیر را به متد

private void btnMoveNext_Click(object sender, EventArgs e)

{

// Move to the next record...

objCurrencyManager.Position += 1;

//Show the current record position...

ShowPosition();

}

قرار دهید: btnMoveLast_Click 25 )در آخر نیز برای تکمیل این قسمت لازم است که کد زیر را در متد

private void btnMoveLast_Click(object sender, EventArgs e)

{

// Set the record position to the last record...

objCurrencyManager.Position =

objCurrencyManager.Count - 1;

// Show the current record position...

ShowPosition();

}

26 )تا این قسمت کد زیادی را در برنامه وارد کرد ه ایم و احتمالاً مشتاق هستید که نتیج ه ی آن را مشاهده کنی د . برنامه را اجرا

متصل شده اند . روی کلیدهای DataView کنید. مشاهده خواهید کرد که کنتر ل های فرم هر یک به فیلد مربوط به خود در

برای ایجاد هماهنگی بین CurrencyManager مربوط به ابتدا و یا انتهای رکوردها کلیک کنید تا نحو ه ی عملکرد کلا س

رکوردی که کنترل ها نمایش می دهند را مشاهده کنید.

7 مشاهده کنی د . تا اینجا در فر م برنامه فقط کلیدهای مربوط به جاب هجا شدن - با اجرای برنامه باید فرمی را مشابه شکل 23

بین رکوردها عمل م ی کنند. با کلیک کردن روی هر یک از کلیدهای بعدی و قبلی و یا روی کلیدهای مربوط به ابتدا و انتها

بین رکوردهای موجود در فرم جاب ه جا شوید . مشاهده خواهید کرد هر بار که با استفاده از این کلیدها رکورد جار ی را تغییر

دهید، عدد نمایش داده شده در کادر در فرم برنامه نیز تغییر کرده و شماره رکورد جاری را نمایش م یدهد.

7- شکل 23

mohsen_mahyar@yahoo.com - C# برنامه نویسی

430

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

اکنون در رکورد قبلی هستی د . همچنین می توانید به آخرین رکورد بروید و روی کلید مربوط به رکورد بعدی کلیک کنی د ، اما

باز هم هیچ تغییری را مشاهده نخواهیم کرد، زیرا در آخرین رکورد هستید.

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

می دهد. این مورد فقط برای ایجاد رابط کاربری بهتر اضافه شده است.

نکته: قسمت ____________های مربوط به مدیریت خطاها و استثناهای احتمالی از کد این قسمت حذف شد ه اند تا جای کمتری گرفته شود .

در هنگام وارد کردن این کد بهتر است که این قسمت را نیز اضافه کنید.

4-اضافه کردن قابلیت مرت بسازی به برنامه - مثال 23

دو بار کلیک کنید تا متد مربوط به رویداد Perform Sort بروید و روی دکمه ی Forml 1)به قسمت طراحی فرم مربوط به

این کنترل ایجاد شود. سپس کد مشخص شده در زیر را به این متد اضافه کنید: Click

private void btnPerformSort_Click(object sender,

EventArgs e)

{

// Determine the appropriate item selected and set the

// Sort property of the DataView object...

switch(cboField.SelectedIndex)

{

case 0: // Last Name

objDataView.Sort = "au_lname";

break;

case 1: // First Name

objDataView.Sort = "au_fname";

break;

case 2: // Book Title

objDataView.Sort = "title";

break;

case 3: // Price

objDataView.Sort = "price";

break;

}

// Call the click event for the MoveFirst button...

btnMoveFirst_Click(null, null);

// Display a message

// that the records have been sorted...

ToolStripStatusLabel1.Text = "Records Sorted";

}

ADO.NET با SQL Server فصل بیست و سوم استفاده از بانک اطلاعاتی

431

موجود در فرم یک ComboBox 2)برنامه را اجرا کنید تا قابلیتی را که در این قسمت به برنامه اضافه کردی م ، ببینید. در کنترل

- کلیک کنید تا داد هها براساس آن ستون مرتب شود. شکل 23 Perform Sort ستون را انتخاب کرده و سپس روی دکمه

مرتب شد هاند Price 8 فرم برنامه را در حالتی نمایش م یدهد که داده های موجود در آن براساس ستون

8- شکل 23

5- اضافه کردن قابلیت جستجو به برنامه - مثال 23

آن Click دو بار کلیک کنید تا متد مربوط به رویدا د Perform Search 1)به قسمت طراحی فرم بروید و روی دکمه ی

ایجاد شود. سپس کد مشخص شده در زیر را در این متد وارد کنید:

private void btnPerformSearch_Click(object sender,

EventArgs e)

{

// Declare local variables...

int intPosition;

// Determine the appropriate item selected and set the

// Sort property of the DataView object...

switch(cboField.SelectedIndex)

{

case 0: // Last Name

objDataView.Sort = "au_lname";

break;

case 1: // First Name

objDataView.Sort = "au_fname";

break;

case 2: // Book Title

objDataView.Sort = "title";

break;

case 3: // Price

objDataView.Sort = "price";

break;

}

// If the search field is not price then...

if (cboField.SelectedIndex < 3)

{

// Find the last name, first name, or title...

intPosition =objDataView.Find(txtSearchCriteria.Text);

}

else

{

// otherwise find the price...

intPosition = objDataView.Find(

اسلام احمد زاده - 09177112161 - C# برنامهنویسی

432

Decimal.Parse(txtSearchCriteria.Text));

}

if (intPosition == -1)

{

// Display a message

// that the record was not found...

ToolStripStatusLabel1.Text = "Record Not Found";

}

else

{

// Otherwise display a message that the record

// was found and reposition the CurrencyManager

// to that record...

ToolStripStatusLabel1.Text = "Record Found";

objCurrencyManager.Position = intPosition;

}

// Show the current record position...

ShowPosition();

}

2)برنامه را اجرا کنید تا ق ابلیت جدید آن را نیز امتحان کنی م . فیلدی که م ی خواهید جستجو براساس آن صورت گیرد را از

وارد کنید. در آخر نیز Search Criteria انتخاب کرده و سپس عبارت مورد جستجو را در داخل فیلد ComboBox داخل

کلیک کنید. Perform Search روی دکمه

اگر رکورد مورد نظر شما در بین دا د ه ها پیدا شود مشاهده خواهید کرد که اطلاعات آن رکورد در فرم نمایش داده م ی شود و

موقعیت رکورد جاری به رکورد پیدا شده تغییر م ی کند. همچنین پیغامی در نوار وضعیت نوشته م ی شود و مشخص م ی کند که

9). همچنین اگر هیچ رکوردی پیدا نشود، متنی در نوار وضعیت نوشته می شود و - رکورد مورد نظر پیدا شده است (شکل 23

مشخص می کند که داده ی مورد نظر پیدا نشده است.

9- شکل 23

6-اضافه کردن رکورد جدید - مثال 23

آن click دو بار کلیک کنید تا متد مربوط به رویداد btnNew بروید و روی دکم ه ی Forml 1) ابتدا به قسمت طراحی فرم

ایجاد شود. سپس کد مشخص شده در زیر را در این متد وارد کنید:

private void btnNew_Click(object sender, EventArgs e)

{

// Clear the book title and price fields...

txtBookTitle.Text = "";

txtPrice.Text = "";

ADO.NET با SQL Server فصل بیست و سوم استفاده از بانک اطلاعاتی

433

}

را وارد کنی م . این متد م سئول اضافه کر د ن یک رکورد داد ه ای جدید به btnAdd_Click 2) حال باید کد مربوط به متد

برنامه است . این زیربرنامه، طولان ی ترین زیربرنامه ای است که در این پروژه وجود دارد و کد زیادی را شامل م ی شود دلیل

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

این کنترل ایجاد شو د . Click دو بار ک لیک کنید تا متد مربوط به رویداد Add به ق سمت طراحی فرم بروید و روی دکم ه

سپس کد زیر را در این متد وارد کنید:

private void btnAdd_Click(object sender, EventArgs e)

{

// Declare local variables and objects...

int intPosition, intMaxID;

String strID;

SqlCommand objCommand = new SqlCommand();

// Save the current record position...

intPosition = objCurrencyManager.Position;

// Create a new SqlCommand object...

SqlCommand maxIdCommand = new SqlCommand(

"SELECT MAX(title_id)" +

"FROM titles WHERE title_id LIKE 'DM%'",

objConnection);

// Open the connection, execute the command

objConnection.Open();

Object maxId = maxIdCommand.ExecuteScalar();

// If the MaxID column is null...

if (maxId == DBNull.Value)

{

// Set a default value of 1000...

intMaxID = 1000;

}

else

{

// otherwise set the strID variable

// to the value in MaxID...

strID = (String)maxId;

// Get the integer part of the string...

intMaxID = int.Parse(strID.Remove(0, 2));

// Increment the value...

intMaxID += 1;

}

// Finally, set the new ID...

strID = "DM" + intMaxID.ToString();

// Set the SqlCommand object properties...

objCommand.Connection = objConnection;

objCommand.CommandText = "INSERT INTO titles " +

"(title_id, title, type, price, pubdate) " +

"VALUES(@title_id,@title,@type,@price,@pubdate);" +

"INSERT INTO titleauthor (au_id, title_id) " +

"VALUES(@au_id,@title_id)";

// Add parameters for the placeholders in the SQL in

// the CommandText property...

// Parameter for the title_id column...

objCommand.Parameters.AddWithValue("@title_id",

strID);

// Parameter for the title column...

objCommand.Parameters.AddWithValue("@title",

txtBookTitle.Text);

// Parameter for the type column

objCommand.Parameters.AddWithValue("@type", "Demo");

// Parameter for the price column...

objCommand.Parameters.AddWithValue("@price",

txtPrice.Text).DbType = DbType.Currency;

// Parameter for the pubdate column

objCommand.Parameters.AddWithValue("@pubdate",

DateTime.Now);

// Parameter for the au_id column...

objCommand.Parameters.AddWithValue("@au_id",

this.BindingContext[objDataView,"au_id"].Current);

// Execute the SqlCommand object

// to insert the new data...

mohsen_mahyar@yahoo.com - C# برنامه نویسی

434

try

{

objCommand.ExecuteNonQuery();

}

catch(SqlException SqlExceptionErr)

{

MessageBox.Show(SqlExceptionErr.Message);

}

// Close the connection...

objConnection.Close();

// Fill the dataset and bind the fields...

FillDataSetAndView();

BindFields();

// Set the record position

// to the one that you saved...

objCurrencyManager.Position = intPosition;

// Show the current record position...

ShowPosition();

// Display a message that the record was added...

ToolStripStatusLabel1.Text = "Record Added";

}

ای را اجرا م یکند که فقط یک مقدار اسکالر برم یگردانند. SQL دستورات ExecuteScalar متد

3) برنامه را اجرا کرده و کاربری را که م ی خواهید عنوان کتاب جدیدی را ب ر ای او ثبت کنید، انتخاب کنید، سپس روی

خالی خواهند شد و م ی توان داده های مربوط به Price ،BookTitle کلیک کنی د . به این ترتیب کادرهای Add دکمه ی

10 وارد کنید. در برنامه به تعداد رکوردهایی که هم اکنون وجود دارند توجه کنید. - کتاب جدید را همانند شکل 23

10- شکل 23

کلیک کنید . به این ترتیب پیغامی در نوار Add 4) حال نام کتاب و قسمت آن ر ا فیلدهای مربوطه وارد کرده و روی دکمه ی

وضعیت نمایش داده م ی شود و بیان م ی کند که رکورد جدید با موفقیت اضافه شده اس ت . همچنین همانطور که در شکل

مشخص است تعداد رکوردها در برنامه یک واحد افزایش پیدا می کند.

11- شکل 23

ADO.NET با SQL Server فصل بیست و سوم استفاده از بانک اطلاعاتی

435

7- ویرایش داده ها - مثال 23

آن ایجاد شو د . click دو بار کلیک کنید تا متد مربوط به رویداد btnUpdate 1) به قسمت طراحی فرم و روی دکم ه ی

سپس کد مشخص شده در زیر را در این متد وارد کنید:

private void btnUpdate_Click(object sender, EventArgs e)

{

// Declare local variables and objects...

int intPosition;

SqlCommand objCommand = new SqlCommand();

// Save the current record position...

intPosition = objCurrencyManager.Position;

// Set the SqlCommand object properties...

objCommand.Connection = objConnection;

objCommand.CommandText = "UPDATE titles " +

"SET title = @title, price = @price " +

"WHERE title_id = @title_id";

objCommand.CommandType = CommandType.Text;

// Add parameters for the placeholders in the SQL in

// the CommandText property...

// Parameter for the title field...

objCommand.Parameters.AddWithValue("@title",

txtBookTitle.Text);

// Parameter for the price field...

objCommand.Parameters.AddWithValue("@price",

txtPrice.Text).DbType = DbType.Currency;

// Parameter for the title_id field...

objCommand.Parameters.AddWithValue("@title_id",

this.BindingContext[objDataView,"title_id"].Current);

// Open the connection...

objConnection.Open();

// Execute the SqlCommand object to update the data...

objCommand.ExecuteNonQuery();

// Close the connection...

objConnection.Close();

// Fill the DataSet and bind the fields...

FillDataSetAndView();

BindFields();

// Set the record position

// to the one that you saved...

objCurrencyManager.Position = intPosition;

// Show the current record position...

ShowPosition();

// Display a message that the record was updated...

ToolStripStatusLabel1.Text = "Record Updated";

}

mohsen_mahyar@yahoo.com - C# برنامه نویسی

436

2)برنامه را اجرا کنی د . حال می توانید اطلاعات مربوط به کتابی که اضافه کرده بودید را تغییر دهید و یا تغییراتی را در

قیمت آن را تغییر دهی د . Price اطلاعات مربوط به دیگر ک ت اب ها ایجاد کنی د . یک کتاب را انتخاب کرده و با استفاده از کاد ر

کلیک کنی د . به این ترتیب تغییرات مورد نظر شما در بانک اطلاعاتی ذخیره م ی شود و پیغامی Update سپس روی دکم ه ی

تیز در نوار وضعیت نمایش داده م یشود و ثبت تغییرات را اعلام می کند.

12- شکل 23

8-حذف کردن یک رکورد - مثال 23

آن ایجاد click دو بار کلیک کنید تا متد مربوط به رویدا د btnDelete 1) به قسمت طراحی فرم رفته و روی دکم ه ی

شود. سپس کد مشخص شده در زیر را در این متد وارد کنید:

private void btnDelete_Click(object sender, EventArgs e)

{

// Declare local variables and objects...

int intPosition;

SqlCommand objCommand = new SqlCommand();

// Save the current record position - 1 for the one to

// be deleted...

intPosition =this.BindingContext[objDataView].Position - 1;

// If the position is less than 0 set it to 0...

if( intPosition < 0 )

intPosition = 0;

// Set the Command object properties...

objCommand.Connection = objConnection;

objCommand.CommandText = "DELETE FROM titleauthor " +

"WHERE title_id = @title_id;" +

"DELETE FROM titles WHERE title_id = @title_id";

// Parameter for the title_id field...

objCommand.Parameters.AddWithValue("@title_id",

this.BindingContext[objDataView,"title_id"].Current);

// Open the database connection...

objConnection.Open();

// Execute the SqlCommand object to update the data...

objCommand.ExecuteNonQuery();

// Close the connection...

objConnection.Close();

// Fill the DataSet and bind the fields...

FillDataSetAndView();

BindFields();

// Set the record position

// to the one that you saved...

ADO.NET با SQL Server فصل بیست و سوم استفاده از بانک اطلاعاتی

437

this.BindingContext[objDataView].Position =

intPosition;

// Show the current record position...

ShowPosition();

// Display a message that the record was deleted...

ToolStripStatusLabel1.Text = "Record Deleted";

}

2) خوب به این ترتیب این پروژه نیز به پایان رسی د . اما به تر است قبل از اینکه از تمام شدن آن خوشحال شویم ابتدا

قابلیت جدیدی که اضافه کرد ه ایم را امتحان کنی م . برنامه را اجرا کرده و هر کتابی که م ی خواهید حذف کنید را انتخاب

که در این ب ر نامه از آن pubs کلیک کنی د . به خاطر داشته باشید که ب ا نک اطلاعاتی Delete کنید، سپس روی دکم ه ی

متصل شوند و SQL Server استفاده کرده ایم یک بانک اطلاعاتی نمونه است و ممکن است افراد دیگری نیز به این

بخواهند از آن برای ت مرینات خود استفاده کنن د . بنابراین بهتر است داد ه هایی را حذف کنیم که در قسمت قبل ایجاد

کرده بودیم . قبل از اینکه یک کتاب را ح ذ ف کنید، به شمار ه ی رکوردها در برنامه توجه کنید، سپس کتاب مورد نظر

خود را حذف کنی د . البته در این قسمت ممکن است با خطا مواجه شوید، زیرا کتابی که برای حذف انتخاب کرد ه اید

در بانک اطلاعاتی رابطه داشته باشن د . بنابراین باید کتاب د یگری را انتخاب کرده sales ممکن است با داد ه های جدول

و حذف کنید.

13- شکل 23

-5-23 خلاصه

و SqlDataAdapter ،SqlCommand ،SqlConnection از قبیل ADO.NET در این فصل با بعضی از کلا سهای مهم

آشنا شدید و مشاهده کردیم که این کلا سها چگونه می توانند هنگام دریافت اطلاعات، وارد کردن SqlParameter

اطلاعات جدید، حذف اطلاعات جاری و یا ویرایش آنها کمک کنند. البته تمام این کلاس ها برای بان کهای اطلاعاتی مورد

ایجاد شده باشند. این کلاس ها دارای کلاس ها دارای SQL Server استفاده قرار می گیرد که بوسیله ی موتور بانک اطلاعاتی

قرار دارند. System.Data.OleDb شروع می شوند و در فضای نامی OleDb کلاس های متناطری هستند که با پیشوند

را بررسی کرده و نحوه ی استفاده System.Data از فضای نامی DataView و DataSet همچنین در این فصل کلا سهای

از آنها در یک برنامه را مشاهده کردیم و دیدیم که چگونه م یتوان با استفاده از این کلا سها اشیایی را ایجاد کرد و داد ههای

موجود در آنها را به کنترل های ساده ی موجود در فرم متصل کرد.

اسلام احمد زاده - 09177112161 - C# برنامهنویسی

438

را برای جابه جایی مابین رکوردها دیدید. در این فصل برای دسترسی به داده ها، CurrencyManager نحوه ی استفاده از

ایجاد داده های جدید، حذف داده های موجود و یا ویرایش آنها از روش های دستی استفاده کرده و کد مربوط به تمام این

موارد را خودمان در برنامه وارد کردیم

mohsen_mahyar@yahoo.com - C# برنامه نویسی

 

 

   + MOHSEN GHASEMI - ۱٠:٢٧ ‎ب.ظ ; ۱۳۸٩/٤/۳٠