بررسی لایه اتصال در ADO.NET

لایه اتصال در Ado.net

بررسی لایه اتصال در Ado.net در این مقاله ما لایه اتصال را بررسی میکنیم و در مورد نقش مهم Data providers(پیاده سازی و مرتبط کردن چندین فضای نام ورابط ها و کلاس های پایه) ها اطلاعاتی بدست می آوریم.Ado.Net از معماری چند لایه که داری چند مفهوم است استفاده می کند که این مفاهیم شامل Connection, Reader, Command, Adapter and Dataset میباشد.Ado.Net برای دسترسی به یک پایگاه داده خاص data providers ها را معرفی کرده که دارای کلاس های خاصی برای اینکار می باشند.مثل اجرای دستورات SQL و بازیابی اطلاعات. data providers ها قابل توسعه می باشند و برنامه نویسان می توانند  data provider خود را برای یک منبع داده اختصاصی ایجاد کنند.

 

در مورد موارد زیر صحبت خواهد شد:

۱- معماری ADO.NET

۲- کلاس اتصال

۳ – دستورات و کلاس خواندن داده

۴- کلاس جدول داده و DataAdapter

۵- کلاس DataSet

معماری ADO.NET

برخی از data providers ها :

۱-SQL

۲-OLE

۳-Oracle

Adon.Net از دو روش زیر استفاده می کند:

۱-Connection-based

اشیا provider نظیر : Connection, Command, DataAdapter and DataReader

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

۲-Content-based

در فضای نام System.Data قرار دارند و شامل DataSet, DataColumn, DataRow and DataRelation       می باشند و آنها به طور کامل مستقل از نوع منبع داده هستند.

فضاهای نام ADO.NET

فضا های نام توضیحات
System.Data شامل تعریف برای ستون ها، روابط، جداول، پایگاه داده، ردیف، نمایش ها و محدودیت ها
System.Data.SqlClient شامل کلاس هایی است که مورد استفاده برای اتصال به یک پایگاه داده SQL سرور مایکروسافت مانند SqlCommand، SQLConnection ، SqlDataAdapter.
System.Data.Odbc کلاس های مورد نیاز برای اتصال به اکثر ODBC drivers این کلاس ها شامل OdbcCommand، OdbcConnection.
System.Data.OracleClient کلاس هایی مانند OracleConnection، OracleCommand مورد نیاز برای اتصال به پایگاه داده اوراکل

کلاس اتصال

شما نیاز به ایجاد یک شی از کلاس Connection دارید تا بتوانید چهار عمل اصلی(اضافه کردن داده – حذف – ویرایش و بازیابی داده ) را روی اطلاعات پایگاه داده انجام دهید.کلاس Connection به شما اجازه می دهد که یک اتصال به منبع داده ایجاد کنی. شی که شما از این کلاس می سازید نیاز به اطلاعات لازم برای پیدا کردن منبع داده دارد و این اطلاعات از طریق یک رشته اتصال به آن داده میشود.

رشته اتصال

ما باید یک رشته اتصال به شی که از کلاس Connection میسازیم بدهیم.رشته اتصال یک سری از تنظیمات نام / ارزش است که توسط (;) از هم جدا شده  است. رشته اتصال نیاز به چند قطعه از اطلاعات، مانند محل  پایگاه داده، نام پایگاه داده و مکانیزم احراز هویت پایگاه داده دارد.


string conString = "Data Source=localhost;Initial Catalog=Master;Integrated Security=SSPI"; 

این رشته اتصال، برای اتصال به پایگاه داده Master در کامپیوتر فعلی با    امنیتی یکپارچ ه(کاربری که در حال حاظر وارد ویندوز شده) استفاده شده است.

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


string conString = "Data Source=localhost;Database=Master;user id=sa;password=sa";

شما میتوانید جزئیات یک رشته اتصال را در فایل تنظیمات برنامه(َApp.config) قرار دهید سپس شما می توانید رشته اتصال خود را با استفاده از  ConfigurationManager بازیابی کنید.

App.Config


<configuration>
 <connectionStrings>
 <add name="Master" connectionString ="Data Source=localhost;Initial Catalog=Master;Integrated Security=SSPI" />
 </connectionStrings>
</configuration> 

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

string conSting = ConfigurationManager.ConnectionStrings["Master"].ConnectionString ;
SqlConnection Conn = new SqlConnection(conSting);

Testing a Connection

هنگامی که شما رشته اتصال را برای ایجاداتصال با منبع داده خاص پیکربندی کردید میتوانید با توابع ()open و ()CLose به راحتی استفاده کنید.

private void Form1_Load(object sender, EventArgs e)
{
 string conSting = ConfigurationManager.ConnectionStrings["Master"].ConnectionString ;
 SqlConnection Conn = new SqlConnection(conSting);
 try
 {
 Conn.Open();
 textBox1.Text = "Server Version=" + Conn.ServerVersion;
 textBox1.Text += "Connection Is=" + Conn.State.ToString();
 }
 catch (Exception err)
 {
 textBox1.Text = err.Message;
 }
 finally
 {
 Conn.Close();
 textBox1.Text += "Connection Is=" + Conn.State.ToString();
 }
}

شما همچنین می توانید از کلاس SqlConnectionStringBuilder به پیکربندی یک رشته اتصال به جای ارائه آن  در فایل App.Config استفاده کنید.

SqlConnectionStringBuilder obj = new SqlConnectionStringBuilder();
obj.DataSource = "localhost";
obj.InitialCatalog = "Master";
obj.IntegratedSecurity = true;
SqlConnection Conn = new SqlConnection(obj.ConnectionString);

کلاس دستورات وخواندن داده

کلاس Command به ما اجازه می دهد تا از انجام هر گونه وظایف تعریف داده ، مانند ایجاد و تغییر جداول پایگاه داده، بازیابی، به روز رسانی و حذف رکورد های جداول بپردازیم.

از شی ساخته شده ار کلاس Command  برای اجرای Query های SQl که در یک متن یک خطی یا رویه های ذخیره شده قرار داده شوندکه بستگی به نوع Command مورد استفاده دارد. قبل از استفاده از Command  باید نوع command  رو به شکل زیر مشخص کنیم:

//Command Class definition
SqlCommand sc = new SqlCommand();
sc.Connection = Conn;
sc.CommandType = CommandType.Text;
sc.CommandText = query;

به شکل زیر نیز میتوان دستورات و کانکشن رو به کلاس Command داد:


SqlCommand sc = <span class="keyword">new</span> SqlCommand(query,Conn);

در این مثال ما از پایگاه داده AdventureWorks جدول Customer  استفاده کرده و به ان متصل میشویم و با استفاده از کلاس SqlDataReader رکورد های آنرا بازیابی می کنیم.

private void Form1_Load(object sender, EventArgs e)
{
 //Connection String
 SqlConnectionStringBuilder obj = new SqlConnectionStringBuilder();
 obj.DataSource = "localhost";
 obj.InitialCatalog = "AdventureWorksLT2008";
 obj.IntegratedSecurity = true;
 // Add Connection string to SqlConnection
 SqlConnection Conn = new SqlConnection(obj.ConnectionString);
 // Query to retrieve records from AdventureWorks Database
 string query = "select FirstName,LastName from SalesLT.Customer";
 //Command Class definition
 SqlCommand sc = new SqlCommand();
 sc.Connection = Conn;
 sc.CommandType = CommandType.Text;
 sc.CommandText = query;
 SqlDataReader sdr = null;
 try
 {
 //Open connection
 Conn.Open();
 sdr = sc.ExecuteReader();
 //Get all records
 while(sdr.Read())
 {
 textBox1.AppendText(sdr.GetValue(0) + "\t" + sdr.GetValue(1));
 textBox1.AppendText("\n");
 }
 }
 catch (Exception err)
 {
 textBox1.Text = err.Message;
 }
 finally
 {
 //Release reader and connection object
 sdr.Close();
 Conn.Close();
 }
}

یک نکته مهم این است که اشیاء کلاس Reader  را پس از اتمام کار آزاد کنیم یا میتوانیم خاصیت CommandBehaviour را به CloseConnection در متد ()ExcuteReader تنظیم کنیم که به صورت خودکار شی کلاس Reader را آزاد می کند:

sdr = sc.ExecuteReader(CommandBehavior.CloseConnection);

DataReader Class

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

سپس شما باید متد ExecuteReader را از شی Command فراخوانی کرده وزمانی که کار شی DataReader به اتمام رسید اتصال را ببندید در غیر اینصورت اتصال باز خواهند ماند.

برای خواندن رکورد ها باید از متد Read در یک حلقه While استفاده کنیم:


//Open connection
Conn.Open();
sdr = sc.ExecuteReader(CommandBehavior.CloseConnection);
//Get all records
while(sdr.Read())
{
textBox1.AppendText(sdr.GetValue(0) + "\t" + sdr.GetValue(1));
textBox1.AppendText("\n");
}

متد ()ExecuteScalar

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


private void Form1_Load(object sender, EventArgs e)
{
//Connection String
string conString = @"Data Source=localhost;Database=AdventureWorksLT2008;Integrated Security=SSPI";
// Add Connection string to SqlConnection
SqlConnection Conn = new SqlConnection(conString);
// Query to retrieve records from AdventureWorks Database
string query = "select COUNT(*) from SalesLT.Customer";
//Command Class definition
SqlCommand sc = new SqlCommand(query, Conn);
//Open connection
Conn.Open();
int CountCustomer = (int)sc.ExecuteScalar();
//Count all records
textBox1.AppendText("Total Customer=\t" + CountCustomer.ToString());
}

متد ()ExecuteNonQuery

این متد دستوراتی را که یک مجموعه بر نمیگردانند اجرا می کند مثلا دستورات Insert,Update,Delete

در این مثال ما یک رکورد خاص از جدول customer از پایگاه داده Adventure Works را تغییر میدهیم.


private void Form1_Load(object sender, EventArgs e)
{
 //Connection String
 string conString = @"Data Source=localhost;Database=AdventureWorksLT2008;Integrated Security=SSPI";
 // Add Connection string to SqlConnection
 SqlConnection Conn = new SqlConnection(conString);
 // Query to retrieve records from AdventureWorks Database
 string query = @"update AdventureWorksLT2008.SalesLT.Customer
 set FirstName='ajay'
 where CustomerID=2";
 //Command Class definition
 SqlCommand sc = new SqlCommand(query, Conn);
 //Open connection
 Conn.Open();
 //Reflect changes into database
 int CountCustomer = sc.ExecuteNonQuery();
 //Result
 MessageBox.Show("Record Update Successfully");
} 

کلاس های DataAdapter و DataTable

DataAdapter پل های ارتباطی در فاصله بین اشیا ء DataTable در حالت قطع و منبع داده فیزیکی  میز ند.

SqlDataAdapter قادر به اجرای دستور انتخاب ،حذف و یا ویرایش روی یک منبع داده است همچنین ورودی را از مجموعه نتیجه درون یک شی DataTable استخراج می کند.کلاس SqlDataAdapter دارای متد ()Fill که کار این متد کپی کردن مجموعه نتیجه درون یک DataTable است.


private void Form1_Load(object sender, EventArgs e)
{
 //Connection String
 string conString = @"Data Source=localhost;Database=AdventureWorksLT2008;Integrated Security=SSPI";
 // Add Connection string to SqlConnection
 SqlConnection Conn = new SqlConnection(conString);
 // Query to retrieve records from AdventureWorks Database
 string query = "select FirstName,LastName from SalesLT.Customer";
 //Command Class definition
 SqlCommand sc = new SqlCommand(query, Conn);
 // Data Adapter definition
 SqlDataAdapter sda = new SqlDataAdapter(sc);
 // filling the result set in data table
 DataTable dt = new DataTable();
 sda.Fill(dt);
 //output in data grid
 dataGridView1.DataSource = dt.DefaultView;
} 

خصوصیات کلاس SqlDataAdapter

 

خصوصیات توضیحات
SelectCommand این دستور برای پر کردن در یک جدول داده  با مجموعه نتیجه به کار می رود
InsertCommand برای ایجاد یک رکورد جدید در پایگاه داده sql به کار می رود
UpdateCommand برای ویرایشیک رکورد موجود در پایگاه داده sql به کار می رود
DeleteCommand برای حذف یک رکورد موجود در پایگاه داده sql به کار می رود

مثال برای SelectCommand


..
// Query to retrieve records from AdventureWorks Database
string query = "select FirstName,LastName from SalesLT.Customer";
//Command Class definition
SqlCommand sc = new SqlCommand(query, Conn);
// Data Adapter definition
SqlDataAdapter sda = new SqlDataAdapter();
sda.SelectCommand = sc;
// filling the result set in data table
DataTable dt = new DataTable();
sda.Fill(dt);
..

مثال برای Update Command


..
string query = @"update AdventureWorksLT2008.SalesLT.Customer
set FirstName='ajay'
where CustomerID=2";
//Command Class definition
SqlCommand sc = new SqlCommand(query, Conn);
// Data Adapter definition
SqlDataAdapter sda = new SqlDataAdapter();
sda.UpdateCommand = sc;
..

دستورات پارامتردار

یک Stored Procedure یک دسته ای از یک یا چند دستورات sql ذخیره شده در پایگاه داده است.آنها شبیه به توابع هستند که  داده ها را با استفاده از پارامتر ورودی میپذیرند و بازگردانده میشوند داده ها از طریق مجموعه نتیجه یا پارامتر خروجی .

در کد sql زیر ما یک روال داریم که یک شماره مشتری را به عنوان پارامتر ورودی می پذیرد و رکرد متناظر با آنرا بر می گرداند:


Create Proc GetCustomer
@CustID varchar(10)
AS
select * from SalesLT.Customer where CustomerID=@CustID

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

در کد زیر مهم ترین بخش تنظیم شی command است.ابتدا نوع دستور را توسط


sc.CommandType = CommandType.StoredProcedure;

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


sc.Parameters.Add(<span class="string">"@CustID"</span>,txtParameter.Text);

کد:


private void btnData_Click(object sender, EventArgs e)
{
//Connection String
string conString = "Data Source=localhost;Database=AdventureWorksLT2008;Integrated Security=SSPI";
// Add Connection string to SqlConnection
SqlConnection Conn = new SqlConnection(conString);
//Command Class definition
SqlCommand sc = new SqlCommand("GetCustomer", Conn);
sc.CommandType = CommandType.StoredProcedure;
sc.Parameters.Add("@CustID",txtParameter.Text);
// Data Adapter definition
SqlDataAdapter sda = new SqlDataAdapter(sc);
// filling the result set in data table
DataTable dt = new DataTable();
sda.Fill(dt);
//output in data grid
dataGridView1.DataSource = dt.DefaultView;
}

همانطور که در شکل زیر مشاهده می کنید شما یک شماره مشتری را به عنوان پارامتر ورودی وارد میکنید ونتیجه در یک گرید نشان داده میشود:

Parameterized Commands (Stored Procedure)

 

کلاس DataSet  

یک DataSet فناوری معماری قطع(Disconnected ) است.ِDataSet شامل صفر یا چند جدول و روابط است.زمانی که شما با یک DataSet کار میکنید داده در منبع داده تغییر نمیکند در عوض تمام تغییرات به صورت محلی به DataSet در حافظه انجام می پذیرد در مثال زیر شما مشاهده می کنید که  چگونه داده از یک جدول بازیابی می شود و از ان برای پر کردن یک شی DataTable در یک DataSet استفاده میشود


private void Form1_Load(object sender, EventArgs e)
{
//Connection String
string conString = "Data Source=localhost;Database=AdventureWorksLT2008;Integrated Security=SSPI";
// Add Connection string to SqlConnection
SqlConnection Conn = new SqlConnection(conString);
string query = "select * from SalesLT.Customer";
//Command Class definition
SqlCommand sc = new SqlCommand(query , Conn);
// Data Adapter definition
SqlDataAdapter sda = new SqlDataAdapter();
sda.SelectCommand = sc;
//data Set definition
DataSet ds = new DataSet();
// filling the result set in data table
sda.Fill(ds, "SalesLT.Customer");
//output in data grid
dataGridView1.DataSource =ds.Tables["SalesLT.Customer"];
}

شما نیاز دارید یک DataSet خالی بسازید و توسط متد ()Fil کلاس SqlDataAdapter یک پرس و جو رو اجرا کنید و نتیجه را در یک DataTable جدید درون DataSet  قرار بدهید .

2

نتیجه گیری:

ADO.NET تکنولوژی دسترسی به داده ها از پلت فرم دات نت است در این مقاله ما لایه اتصال را مورد بررسی قرار دادیم و نقش قابل توجه data providers را فرا گرفتیم و درنهایت با اشیا کاربردی commands, connection, reader و دستورات Select, delete and update آشنا شدیم.

پاکان رحمانی

نوشته‌های مرتبط

دیدگاه‌ها

*
*

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

    سعدی پاسخ

    کارتون حرف نداره - مقاله ی جالبی نوشتید - ممنون . پیشنهاد می کنم روی EF هم همین کار رو انجام بدید .

جشنواره فروش ویژه عید تا عید با تخفیف های باورنکردنی در ام اس پی سافتبزن بریم
+