Skip to content

3. مطالعه موردی

ما می‌خواهیم یک برنامه .NET بنویسیم که به کاربر امکان دهد شبیه‌سازی‌هایی را برای محاسبه دستمزد مراقبان کودک شاغل در انجمن «Maison de la petite enfance» در یک نهاد محلی اجرا کند. ما به همان اندازه که بر خود کد DotNet برنامه تمرکز می‌کنیم، بر سازماندهی آن نیز تمرکز خواهیم کرد.

3.1. : پایگاه داده

داده‌های ثابتی که برای تولید فیش حقوقی لازم است، در یک پایگاه داده SQL Server Express به نام dbpam (pam = Paie Assistante Maternelle) ذخیره می‌شود. این پایگاه داده یک مدیر به نام sa با رمز عبور msde دارد.

 

این پایگاه داده شامل سه جدول EMPLOYES، COTISATIONS و INDEMNITES با ساختار زیر است:


Table EMPLOYES : rassemble des informations sur les différentes assistantes maternelles

ساختار:

SS
شماره بیمه اجتماعی کارمند – کلید اصلی
NOM
نام کارمند
prenom
نام کوچک کارمند
ADRESSE
آدرس آنها
VILLE
شهر او
CODEPOSTAL
کد پستی او
INDICE
شاخص حقوق او – کلید خارجی روی فیلد [INDICE] در جدول [INDEMNITES]

محتویات آن می‌تواند به شرح زیر باشد:

Image


Table COTISATIONS : rassemble les taux des cotisations sociales prélevées sur le salaire

ساختار:

محتوای آن می‌تواند به شرح زیر باشد:

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


Table INDEMNITES : rassemble les différentes indemnités dépendant de l'indice de l'employé
INDICE
شاخص حقوق – کلید اصلی
BASEHEURE
قیمت خالص به یورو برای یک ساعت مراقبت از کودک
ENTRETIENJOUR
کمک‌هزینه نگهداری به یورو برای هر روز مراقبت
REPASJOUR
کمک‌هزینه غذا به یورو برای هر روز مراقبت از کودک
INDEMNITESCP
اضافه حقوق تعطیلات. این درصد است که باید به حقوق پایه اعمال شود.

محتوای آن می‌تواند به شرح زیر باشد:

Image

شایان ذکر است که مزایای دریافتی ممکن است از یک پرستار کودک به دیگری متفاوت باشد. این مزایا در واقع از طریق گروه حقوق (pay grade) به پرستار کودک مربوطه مرتبط هستند. برای مثال، خانم ماری جووینال که رتبه حقوق ۲ (جدول EMPLOYES) دارد، دستمزد ساعتی ۲.۱ یورو (جدول INDEMNITES) دارد.

روابط بین سه جدول به شرح زیر است:

یک رابطه کلید خارجی بین ستون EMPLOYES (INDICE) و ستون INDEMNITES (INDICE) وجود دارد.

پایگاه داده [dbpam] که به این روش ایجاد شده است، دو فایل را در پوشه SQL Server Express تولید می‌کند:

فایل‌های [dbpam.mdf, dbpam_log.ldf] را می‌توان به دستگاه دیگری منتقل کرد و دوباره به سرور Express SGBD SQL در آن دستگاه متصل نمود. در اینجا نحوه انجام آن آمده است:

  • فایل‌های موجود در BD و [dbpam] به یک پوشه کپی می‌شوند
 
  • سرور اکسپرس SQL را راه‌اندازی کنید
  • با استفاده از کلاینت SQL Server Management Studio Express، فایل [dbpam.mdf] را به SGBD متصل کنید:
  1. روی [Databases] کلیک راست کرده و Attach را انتخاب کنید
  2. فایل [dbpam.mdf] را از طریق یک دکمه ([Add] نمایش داده نشده) انتخاب کنید
  3. فایل پیوست یک BD ایجاد خواهد کرد که نباید از قبل وجود داشته باشد. در اینجا، در فیلد [Attach AsBD جدید با نام [dbpam2] نام‌گذاری شده است.
  4. ما می‌توانیم BD جدید و جداول آن را ببینیم

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

3.2. : نحوه محاسبه حقوق پرستار کودک

اکنون توضیح می‌دهیم که حقوق ماهانه یک پرستار کودک چگونه محاسبه می‌شود. به‌عنوان مثال، حقوق خانم ماری جووینال را در نظر می‌گیریم که در ماه حقوق، در طول ۲۰ روز، ۱۵۰ ساعت کار کرده است.

عوامل زیر در نظر گرفته می‌شوند:

[TOTALHEURES]: total des
 heures travaillées dans le
 mois

[TOTALJOURS]: total des jours
 travaillés dans le mois
[TOTALHEURES]=150
[TOTALJOURS]= 20
حقوق پایه مراقب کودک با استفاده از فرمول زیر محاسبه می‌شود:
[SALAIREBASE]=([TOTALHEURES]*
[BASEHEURE])*(1+
[INDEMNITESCP]/100)
[SALAIREBASE]=(150*[2.1])*(1+0.15)= 362,25
باید تعدادی از حق بیمه تأمین اجتماعی از این حقوق پایه کسر شود:

Contribution sociale
 généralisée et contribution
 au remboursement de la dette
 sociale : [SALAIREBASE]*[CSGRDS/100]

Contribution sociale
 généralisée déductible :
 [SALAIREBASE]*[CSGD/100]

Sécurité sociale, veuvage,
 vieillesse :
 [SALAIREBASE]*[SECU/100]
Retraite Complémentaire + 
AGPF + Assurance Chômage : 
[SALAIREBASE]*[RETRAITE/100]
CSGRDS : 12,64
CSGD : 22,28
Sécurité sociale : 34,02
Retraite : 28,55
مجموع حق بیمه تأمین اجتماعی:
[COTISATIONSSOCIALES]=[SALAIR
EBASE]*(CSGRDS+CSGD+SECU+RETR
[COTISATIONSSOCIALES]=97,48
علاوه بر این، پرستار کودک برای هر روز کاری، مستحق دریافت فوق‌العاده معیشت و فوق‌العاده غذا است. بنابراین، او مزایای زیر را دریافت می‌کند:

[Indemnités]=[TOTALJOURS]*(EN
TRETIENJOUR+REPASJOUR)
[INDEMNITES]=104
در نهایت، حقوق خالص قابل پرداخت به مراقب کودک به شرح زیر است:
[SALAIREBASE]-
[COTISATIONSSOCIALES]+
[INDEMNITÉS]
[salaire NET]=368,77

3.3. یادآوری‌ها ADO.NET

برنامه محاسبه حقوق و دستمزد به اطلاعات موجود در پایگاه داده [dbpam] نیاز دارد. معماری آن به شرح زیر خواهد بود:

  • در [1]، کاربر یک درخواست ارسال می‌کند
  • در [2]، برنامه حقوق و دستمزد آن را پردازش می‌کند.
  • سپس ممکن است به داده‌هایی از پایگاه داده نیاز داشته باشد. بنابراین یک پرس‌وجو را به ارائه‌دهنده ADO.NET برای SGBD که توسط [4] استفاده می‌شود، ارسال می‌کند.
  • این ارائه‌دهنده از پایگاه داده [5] پرس‌وجو می‌کند و نتایج را به ارائه‌دهنده ADO.NET بازمی‌گرداند که به نوبه خود آن‌ها را به برنامه ارسال می‌کند
  • که این نتایج را پردازش کرده و یک پاسخ ([5]) برای کاربر تولید می‌کند

اکنون رابط‌های اصلی ارائه‌شده توسط یک ارائه‌دهنده ADO.NET به مشتریان [3] خود را بررسی خواهیم کرد.

در حالت متصل، برنامه:

  1. یک اتصال به منبع داده برقرار می‌کند
  2. در حالت آنلاین، برنامه:یک اتصال به منبع داده باز می‌کند اتصال را می‌بندد با منبع داده در حالت خواندن/نوشتن کار می‌کند
  3. ارتباط را قطع می‌کند

سه رابط ADO.NET عمدتاً در این عملیات دخیل هستند:

  • IDbConnection، که خواص و متدهای اتصال را در بر می‌گیرد.
  • IDbCommand، که خواص و متدهای دستور اجراشده SQL را در بر می‌گیرد.
  • IDataReader، که خواص و متدهای نتیجهٔ فرمان Select SQL را در بر می‌گیرد.

رابط IDbConnection

برای مدیریت اتصال به پایگاه داده استفاده می‌شود. متدهای M و خواص P این رابط شامل موارد زیر هستند:

نام
نوع
نقش
ConnectionString
P
رشته اتصال پایگاه داده. این مشخص می‌کند تمام پارامترهای لازم برای برقراری اتصال به یک پایگاه دادهٔ خاص.
Open
M
ارتباط را به پایگاه داده تعریف‌شده توسط ConnectionString باز می‌کند
Close
M
اتصال را می‌بندد
BeginTransaction
M
یک تراکنش را آغاز می‌کند.
State
P
وضعیت اتصال: ConnectionState.Closed, ConnectionState.Open, ConnectionState.Connecting, ConnectionState.Executing, ConnectionState.Fetching, ConnectionState.Broken

اگر Connection کلاسی باشد که رابط IDbConnection را پیاده‌سازی می‌کند، اتصال به شرح زیر باز می‌شود:

1
2
3
IDbConnection connexion=new Connection();
connexion.ConnectionString=...;
connexion.Open();

رابط IDbCommand

برای اجرای یک دستور SQL یا یک رویهٔ ذخیره‌شده استفاده می‌شود. متدها (M) و ویژگی‌های (P) این رابط شامل موارد زیر هستند:

نام
نوع
نقش
CommandType
P
مشخص می‌کند که چه چیزی باید اجرا شود – مقادیر آن را از یک شمارش‌شده می‌گیرد:
- CommandType.Text: دستور SQL را که در خصوصیت CommandText تعریف شده است، اجرا می‌کند. این مقدار پیش‌فرض است.
- CommandType.StoredProcedure: یک رویهٔ ذخیره‌شده در پایگاه داده را اجرا می‌کند
CommandText
P
- متن دستور SQL که در صورت برابر بودن CommandType با CommandType.Text اجرا می‌شود
- نام رویهٔ ذخیره‌شده‌ای که در صورت برابر بودن CommandType با CommandType.StoredProcedure اجرا می‌شود
Connection
P
اتصال IDbConnection که برای اجرای دستور SQL استفاده می‌شود
Transaction
P
معامله IDbTransaction که در آن فرمان SQL اجرا می‌شود
Parameters
P
فهرست پارامترها برای یک فرمان پیکربندی‌شده SQL. فرمان `update articles set price=price*1.1 where id=@id` دارای پارامتر @id است.
ExecuteReader
M
برای اجرای یک دستور SQL Select. این یک شیء IDataReader را بازمی‌گرداند که نمایانگر نتیجه Select است.
ExecuteNonQuery
M
برای اجرای یک فرمان SQL (به‌روزرسانی، درج، حذف). این تابع تعداد ردیف‌های تحت تأثیر عملیات (به‌روزرسانی‌شده، درج‌شده، حذف‌شده) را برمی‌گرداند.
ExecuteScalar
M
برای اجرای پرس‌وجوی SQL Select که تنها یک نتیجه بازمی‌گرداند، مانند: select count(*) from articles.
CreateParameter
M
برای ایجاد پارامترها IDbParameter برای یک فرمان پیکربندی‌شده SQL.
Prepare
M
بهینه‌سازی اجرای یک پرس‌وجوی پارامتریک را هنگام اجرای مکرر آن با پارامترهای مختلف امکان‌پذیر می‌سازد.

اگر Command کلاسی باشد که رابط IDbCommand را پیاده‌سازی می‌کند، اجرای یک فرمان SQL بدون تراکنش شکل زیر را خواهد داشت:

//اتصال برقرار شد 
IDbConnection connexion=...
connexion.Open();
// آماده‌سازی فرمان
IDbCommand commande=new Command();
commande.Connection=connexion;
// اجرای عبارت SELECT
commande.CommandText="select ...";
IDbDataReader reader=commande.ExecuteReader();
...
// اجرای دستورات به‌روزرسانی، درج و حذف
commande.CommandText="insert ...";
int nbLignesInsérées=commande.ExecuteNonQuery();
...
// بستن اتصال
connexion.Close();

رابط IDataReader

برای محصورسازی نتایج یک فرمان SQL یا Select استفاده می‌شود. یک شیء IDataReader نمایانگر جدولی با سطرها و ستون‌ها است که به‌صورت متوالی پردازش می‌شوند: ابتدا سطر اول، سپس سطر دوم و غیره. متدها (M) و ویژگی‌ها (P) این رابط شامل موارد زیر هستند:

نام
نوع
نقش
FieldCount
P
تعداد ستون‌ها در جدول IDataReader
GetName
M
GetName(i) نام ستون شماره i در جدول IDataReader را برمی‌گرداند.
Item
P
آیتم [i] نمایانگر شماره ستون i از ردیف جاری در جدول IDataReader است.
Read
M
به سطر بعدی جدول IDataReader می‌رود. اگر عملیات خواندن با موفقیت انجام شود، مقدار بولی True را بازمی‌گرداند، در غیر این صورت False.
Close
M
جدول IDataReader را می‌بندد.
GetBoolean
M
GetBoolean(i): مقدار بولی ستون شماره i در ردیف جاری جدول IDataReader را برمی‌گرداند. سایر روش‌های مشابه به شرح زیر هستند: GetDateTime, GetDecimal, GetDouble, GetFloat, GetInt16, GetInt32, GetInt64, GetString.
Getvalue
M
Getvalue(i): مقدار ستون شماره i در ردیف جاری جدول IDataReader را به نوع object برمی‌گرداند.
IsDBNull
M
IsDBNull(i) مقدار True را بازمی‌گرداند اگر ستون شماره i از ردیف جاری در جدول IDataReader فاقد مقدار باشد، که با مقدار SQL NULL نشان داده می‌شود.

ارزیابی یک شیء IDataReader اغلب به شکل زیر است:

// باز کردن اتصال 
IDbConnection connexion=...
connexion.Open();
// آماده‌سازی دستور
IDbCommand commande=new Command();
commande.Connection=connexion;
//اجرای دستور SELECT
commande.CommandText="select ...";
IDataReader reader=commande.ExecuteReader();
//پردازش نتایج
while(reader.Read()){
     // پردازش خط جاری
        ...
}
// بستن خواننده
reader.Close();
// بستن اتصال
connexion.Close();