در این نوشته می خواهیم درباره ADO.NET و Oracle Data Provider در Dot Net و چگونگی دسترسی به داده های پایگاه داده اوراکل از سی شارپ را بگوییم. در اینجا دو جدول به نام های Employees و Dept داریم که داده های کارمندان و دپارتمان ها را در خود نگه می دارند. دو شکل ساختار این جدول ها را نشان می دهند. ستون های Employee_Id و DeptNo کلیدهای اصلی در جدول ها هستند و در جدول Employees ستون DeptNo کلید بیرونی (خارجی) به جدول Dept است. بنابراین رابطه یک به چنند میان کارمند و دپارتمان است به گونه ای که هر کارمند دارای یک دپارتمان و هر دپارتمام دارای چندین کارمند است. همچنین هر دو جدول ستونی به نام Loc دارند که شهر زندگی کارمند و شهر دپارتمان شرکت را در خود دارند. شاید مقدار این ستون ها برای سطرهایی از دو جدول یکسان باشند.

پرس و جوهای پروژه

بر پایه شکل زیر در این پروژه ساده، دو Radio Button داریم که با برگزیدن (انتخاب کردن) هر کدام، یکی از دو پرس و جو زیر برای انجام شدن، آماده می شود. کد زیر یکی از این دو پرس و جو را نشان می دهد که بر پایه Join کردن دو جدول، همه سطرها را برگشت می دهد. توجه کنید Join بر پایه برابر بودن مقدار ستون های deptno در هر دو جدول ها است. در کد زیر، این پرس و جو در متغیری به نام sql نگهداری می شود که این متغیر ویژگی (Property) است که در بدنه کلاس Form1 شناسانده (تعریف) شده است. دو کد زیر، نخست شناساندن ویژگی (متغیر) sql و سپس دستور SQL برای پرس و جو را نشان می دهند. اگر در فرم زیر، Radio Button به نام All Rows را برگزیده (انتخاب کرده) باشیم، پس این پرس و جوی باید انجام شود.

زمانی که روی Radio Button به نام Same Location را برگزیده باشید، پس پرس و جوی زیر انجام خواهد شد. این همانند بالای است ولی در یک شرط دیگر پیش روی AND هست که برابر بودن شهر زندگی کارمند و شهر دپارتمان شرکت را بررسی می کند.

اتصال به پایگاه داده اوراکل

در نوشته های پیشین نشان دادیم که در پروژه های Dot Net (و نه Dot Net Core) رشته اتصال را در فایل App.config و در بخش ConnectionString می نوشتیم. در اینجا می خواهیم ADO.NET و Oracle Data Provider را به کار ببریم، بنابراین پیش از هر چیز باید Oracle Data Provider را همانند شکل زیر درون پروژه خود و به کمک Manage NuGet Packages نصب کنیم.

رشته اتصال در فایل App.config

در کد زیر رشته اتصال در بخش connectionStrings نوشته شده است. پارامتر name نامی برای رشته اتصال مشخص می کند که سپس از این نام در کدهای سی شارپ کمک می گیریم تا به رشته اتصال دسترسی داشته باشیم. پارامتر دوم connectionString است که خودش پارامترهای گوناگونی را نشان می دهد. User در برگیرنده دو بخش Id یا همان نام کاربری در اوراکل و Password گذرواژه است.

Data Source مشخصه های سرور را نشان می دهد که شامل بخش ADDRESS هست که خود آن در برگیرنده PROTOCOL که معولا tcp، HOST که نام یا آدرس سرور اوراکل، PORT شماره درگاه که معولا 1521 است و در پایان SERVICE_NAME که نام سرویس اوراکل را نشان می دهد. این پارامتر معمولا همان نام Instance اوراکل است که پایگاه داده را میزبانی می کند. در شکل زیر می بینید که من connectionStrings و سپس درون آن add را پس از oracle.manageddataaccess.client/ قرار داده ام. همچنین درون add پارامتر name در اینجا orclconn است که خواهید دید از آن در کدهای سی شارپ برای دسترسی به رشته اتصال کمک می گیریم.

معماری اوراکل – مفهوم instance در اوراکل

پیکربندی شبکه – فایل listener.ora

پیکربندی شبکه – فایل tnsnames.ora

کدام کتابخانه ها را نیاز داریم

در گام های پیش بسته Oracle Data Provider را نصب کردیم و پس از هر چیز باید دو کتابخانه Oracle.ManagedDataAccess.Client و Oracle.ManagedDataAccess.Types باید به برنامه پیوست شوند. چون می خواهیم با کلاس های DataTable و DataRow کار کنیم، پس کتابخانه System.Data را نیاز داریم. همچنین چون با فرم Windows Forms کار می کنیم، خود ویژوال استادیو دات نت، خودکار System.Windows.Forms را پیوست کرده است. همچنین چون می خواهیم برای اتصال به پایگاه داده به پیکربندی های درون App.Conf دسترسی داشته باشیم، پس System.Configuration نیز نیاز است.

ساخت اتصال به پایگاه داده

بر پایه نوشته های پیشین برای اتصال به پایگاه داده باید از کلاس OracleConnection و رشته اتصال کمک بگیریم. رشته اتصال در فایل App.config است، بنابراین باید از درون کدهای سی شارپ به آن دسترسی داشته باشیم. کد زیر متدی را نشان می دهد که یک گونه کلاس OracleConnection را بر می گرداند. بنابراین درون متد ()GetConnection نخست رشته اتصال را به کمک کتابخانه System.Configuration واکشی می کنیم و سپس آن را به تابع سازنده کلاس OracleConnection می فرستیم و در پایان شی connection از کلاس OracleConnection برگشت داده می شود.

افزودن System.Configuration به پروژه

کد زیر بخشی از متد ()GetConfiguration است که در آن و به کمک کلاس ConfigurationManager از کتابخانه System.Configuration، پارامتر رشته اتصال ConnectionStrings خوانده می شود. در این جا اندیس orclconn همان نام (name) است که برای رشته اتصال تعیین کردیم. سپس ما به دنبال خود پارامتر ConnectionString هستیم که همان ترکیب Data Source و User را در خود دارد. توجه کنید واپسین بخش از دستور زیر ConnectionString است که با ConfigurationManager.ConnectionStrings تفاوت دارد.

توجه کنید که System.Configuration پیش فرض در پروژه شما و در بخش References نیست، پس روی References پروژه راست کلیک کرده و سپس Add Reference را کلیک کنید تا شکل زیر نشان داده شود، پس در فیلد جستجو عبارت config را نوشته و سپس همانند شکل زیر، System.Configuration را برگزنید. بنابراین با این کار، کتابخانه System.Configuration شناخته می شود.

در پایان، نخست نمونه ای از کلاس OracleConnection ساخته ایم و رشته اتصال واکشی شده در بَند پیشین را به تابع سازنده فرستاده ایم. سپس شی به نام  connection برگشت داده می شود که به پایگاه داده اشاره شده در رشته اتصال اشاره می کند. بنابراین در جای دیگری از این کلاس (کلاس Form) می توانید این متد را برای اتصال فراخوانی کنید.

اداره کردن رویداد Click دگمه Show و باز کردن پایگاه داده

در شکل بالا با فشردن کیلد Show، سطرهایی از جدول نشان داده می شوند ولی اینکه کدام سطرها نشان داده شوند، بستگی دارد کدام Radio Button را برگزیده (انتخاب) کرده باشیم. در کد زیر رویداد Click دگمه با نام شی showBtn اداره می شود. در آن و در بدنه شرط های بَندهای 3 تا 17 بررسی می شود که شما کدام Radio Button را برگزیده اید. همچنین بر پایه شکل بالا، می بینید که Radio Button با نام شی allRowsRdb پیش فرض فعال است، پس اگر تنها کلید Show را فشار دهید، پس همه سطرها با نخستین پرس و جو در DataGridView نشان داده می شوند.

توجه کنید بر پایه اینکه کدام Radio Button برگزیده (انتخاب) شده باشد، پس متغیر sql با یکی از دو پرس و جو پُر خواهد شد. متغیر sql به گونه private در کلاس Form شناسانده (تعریف) شده است. پس از آماده شدن پرس و جو، آن باید به پایگاه داده فرستاده شود. درمتد ()GetConnection به پایگاه داده وصل شدیم ولی هنوز پایگاه داده آماده به کار گیری نیست، زیرا باید آن را به کمک متد ()Open از کلاس OracleConnection باز کنیم. بنابراین در بند 19 متغیری از برگشتی متد ()GetConnection ساخته شد که با توجه به مقدار برگشتی متد که از کلاس OracleConnection است، متغیر connection در خط 19، از گونه همین کلاس خواهد بود. سپس در بند 20، متد ()Open از کلاس OracleConnection را به کمک متغیر connection فراخوانی کرده ایم. در برنامه ما یک StatusBar هست که اگر انجام متد  ()Open درست انجام شود، پس یک نوشته در پنل SatatusBar نشان داده می شود.

پس از آن و بر پایه کدهای زیر باید نمونه ای از کلاس OracleCommand را بسازیم و سپس دو ویژگی Connection و CommandText را مقدار دهی کنیم. ویژگی Connection از کلاس OracleCommand، متغیری را دریافت می کند که به کلاس OracleConnection اشاره دارد. ویژگی CommandText نیز رشته را درایفت می کند که به رشته پرس و جو اشاره دارد که در اینجا همان متغیر sql است. سپس چون می خواهیم SELECT را انجام دهیم، پس باید به کمک متد ()ExecuteReader پرس و جوی درون متغیر command را انجام دهیم. توجه کنید که مقدار برگشتی ()ExecuteReader از گونه کلاس DataReader است، پس متغیر reader در اینجا نیز از همین کلاس خواهد بود.

تا بدین جا پرس و جو به پایگاه داده رفته و پاسخ دریافت شده است و اکنو در متغیر reader نگهداری می شود. در گام پسین (بعدی) یک متغیر DataTable می سازیم و سپس به کمک متد ()Load از کلاس DataTable، همه سطرهای واکشی شده را از متغیر reader به درون آن می ریزیم. سپس این متغیر که data نام دارد، را به عنوان منبع داده به DataGridView می دهیم. سپس به کمک متد ()Close اتصال به پایگاه داده قطع می شود.