بررسی اجمالی معماری ADO.NET
جمعه 7 اسفند 1394ADO.NET به طور عمده برای اتصال به دیتابیس از Reader ، Command ، Adapter و اشیاء Dataset استفاده میکند. در این مقاله درباره معماری ADO.NET صحبت میشود.
آنچه در این مقاله ارائه میشود:
کلاس Connection
Command و Data Reader کلاس
DataAdapter و DataTable کلاس
DataSet کلاس
Provider Agnostic code
معماریADO.NET
ADO.NET از معماری چند لایه اسفاده میکند،و به طور عمده دارای چند مفهوم برای اتصال مانند، Reader ، Command ، Adapter و اشیاء Dataset است. ADO.NET مجموعه ای از کلاس های ویژه برای دسترسی به یک پایگاه داده خاص، اجرای دستورات SQL و بازیابی داده ها را ، معرفی کرد. dataprovider ها توسعه پذیر می باشند. توسعه دهندگان می توانند providerهای خود را برای یک منبع داده اختصاصی ایجاد کنند. نمونه هایی از ارائه data provider مانند SQL Server providers ، OLE DB و Oracle provider وجود دارند.
ADO.NET دو نوع از کلاس اشیاء را ارائه میدهد:
مبتنی بر اتصال : آنها از اشیاء data provider ، از قبیل Connection ، Command ، DataAdapter و DataReader می باشند و SQL statement ها را اجرا و به دیتابیس اتصال میدهد.
مبتنی بر محتوا: آنها در فضای نام System.Data قرار دارند و شامل DataSet ، DataColumn، DataRow و DataRelation هستند و کاملا مستقل از نوع منبع داده هستند.
ADO.NET Namespaces
جدول1-1
کلاس Connection
شما نیاز به ایجاد یک کلاس Connection برای افزودن، به روز رسانی، حذف و بازیابی داده ها از دیتابیس دارید. کلاس Connection اجازه می دهد تا با یک connection به منبع داده متصل شویم. کلاس connection نیاز به اطلاعات لازم برای کشف منبع داده دارد ،که این اطلاعات توسط connection string ارائه می شود
در یک کلاس Connection ، نیاز به یک Connection Strings داریم. connection string یک سری تنظیمات نام / مقدار است که توسط سمی کالن از هم جدا میشوند و نیاز به اطلاعاتی نظیر محل دیتابیس ،نام دیتابیس و مکانیزم احراز هویت (authentication) دیتابیس دارد.
از این اتصال ،برای اتصال به پایگاه داده مستر بر روی کامپیوتر فعلی با امنیتی یکپارچه ، استفاده میشود(نشان می دهد کاربر در حال حاضر وارد ویندوز شده و می تواند به پایگاه داده دسترسی داشته باشد)
C# Code
string conString = "Data Source=localhost;Initial Catalog=Master;Integrated Security=SSPI";
در این مورد اگر امنیت یکپارچه باشد، از آن پشتیبانی نمی شود .پس اتصال باید شامل ترکیبی معتبر از یک نام کاربری و رمز عبور باشد ،که در کد زیر نشان داده میشود
C# Code
string conString = "Data Source=localhost;Database=Master;user id=sa;password=sa";
در صورت استفاده از OLE DB provider ، رشته اتصال(Connection Strings) نیاز به افزودن برخی تنظیمات برای شناسایی درایور های OLE DB ،را دارد.
C# Code
string conString = "Data Source=localhost;Initial Catalog=Master;user id=sa;password=;Provider=MSDAORA";
شما می توانید جزئیات رشته اتصال را در فایل تنظیمات global application مشخص و سپس رشته اتصال خود را با نام ConfigurationManager مانند زیر بازیابی کنید.
<configuration> <connectionStrings> <add name="Master" connectionString ="Data Source=localhost;Initial Catalog=Master;Integrated Security=SSPI" /> </connectionStrings> </configuration>
هنگامی که تمام جزئیات را در فایل app.config که مربوط به Connection Strings است قرار دهید، می توانید از این تعریف در فایل کد زیر استفاده کنید.
C# Code
string conSting = ConfigurationManager.ConnectionStrings["Master"].ConnectionString ; SqlConnection Conn = new SqlConnection(conSting);
تست Connection
هنگامی که Connection Strings ، با حق برقراری اتصال با منبع داده پیکربندی شده باشد ، به سادگی میتوانید از open() و ()Close ،مانند متدهای زیر استفاده کنید.
C# Code
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 برای پیکربندی یک Connection Strings به جای قرار دادن آن در فایل app.config ،مانند زیر استفاده کنید.
C# Code
SqlConnectionStringBuilder obj = new SqlConnectionStringBuilder(); obj.DataSource = "localhost"; obj.InitialCatalog = "Master"; obj.IntegratedSecurity = true; SqlConnection Conn = new SqlConnection(obj.ConnectionString);
کلاسهای Command و Data Reader
کلاس Command اجازه می دهد تا هر گونه وظایف data definition ها مانند ایجاد و تغییر جداول و دیتابیس ها، بازیابی، بروزرسانی و حذف رکوردها را انجام شود. از شی Command ؛ برای اجرایSQL queries ، inline text و یا یک Stored Procedure استفاده می شود .همه اینها وابسته به نوع Command هستند. قبل از استفاده از دستور، شما نیاز به پیکربندی Command Type ، text و property های اتصال دارید.
C# Code
//Command Class definition SqlCommand sc = new SqlCommand(); sc.Connection = Conn; sc.CommandType = CommandType.Text; sc.CommandText = query;
جای این کار میتوانید آرگومان اتصال را مستقیما به کلاس Command مانند زیر منتقل کنید.
C# Code
//Command Class definition SqlCommand sc = new SqlCommand(query,Conn);
در مثال زیر، یک window application form ویک کنترل Text Box ایجاد میکنیم. برای سازماندهی ،یک اتصال به جدول Customer از بانک اطلاعاتی AdventureWorks برقرار میکنیم .سپس، با استفاده از کلاس SqlDataReader، تمام رکودهای جدول و FirstName و LastName را در کنترل TextBox با اجرای While() loop مانند زیر نمایش میدهیم .
C# Code
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(); } }
می توانید پروپرتی CommandBehavior را برای بستن اتصال در متد ExecuteReader () برای جلوگیری از burdon دستی مانند زیر تنظیم کنید.
C# Code
//Automatically releasing the Reader class Object sdr = sc.ExecuteReader(CommandBehavior.CloseConnection);
کلاس DataReader
شی کلاس DataReader ،اجازه خواندن اطلاعات بازگردانده شده توسط یک دستور SELECT و orward-only و read-only را به cursor میدهد. شی فوق را نمی توان مستقیما معرفی کرد. در عوض شما باید متد ExecuteReader از شیء Command و close را درزمان استفاده از Data Reader ، فراخوانی کنید, در غیر این صورت ارتباط فعال باقی می ماند تا زمانی که به صراحت بسته شود.
DataReader با متد ExecuteReader ()
هنگامی که DataReader دارید ؛می توانید چرخه را از طریق رکوردها ومتد Read () در while loop فراخوانی کنید.حرکت مکان نمای ردیف به رکورد بعدی است.
C# Code
//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 ()
متد ExecuteScalar () مقدار ذخیره شده در اولین فیلد از سطر اول درنتایج تولید شده توسط command های SELECT query را برمیگرداند. این متد معمولا برای شمارش تعداد کل ردیف ها در جدول است.
C# Code
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 ()
متد ExecuteNonQuery () دستوراتی است که یک result set برنمی گرداند، به عنوان مثال INSERT ، UPDATE و DELETE را اجرا می کند. در مثال ما اصلاحاتی برای یک رکورد خاص در جدول Customer از بانک اطلاعاتی AdventureWorks ساخته شده است.
C# Code
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 قادر به اجرای SELECT، DELETE و UPDATE statement در یک منبع داده و همچنین ورودی result set را در شی DataTable استخراج میکند. کلاس SqlDataAdapter یک متد به نام Fill() برای کپی کردن result set به DataTable فراهم می کند.
C# Code
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 استفاده میشوند.
جدول 1-2
مثالی از 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)
یک stored procedure دسته ای از یک یا چند دستور است SQL که در دیتابیس ذخیره شده اند. آنها شبیه به یک تابع که در آنها بلوک ها بصورت منطقی بخوبی کپسوله شده اند .داده ها با استفاده یک پارامتر ورودی میپذیرند و بازگشت داده ها از طریق result set و یا پارامتر خروجی می باشد. در زیر ،کد SQL مورد نیاز برای ایجاد یک procedure برای استخراج یک ID Customer خاص از جدول Customer قرار دارد.
Sql.script
Create Proc GetCustomer @CustID varchar(10) AS select * from SalesLT.Customer where CustomerID=@CustID GO
بعد شما می توانید یک SqlCommand برای فراخوانی Stored Procedure ایجاد کنید. این دستور یک پارامتر را به عنوان ورودی میگیرد و رکورد را برمی گرداند. command پارامتر، اساسا از placeholder در متن SQL استفاده میکند . placeholder به صورت پویا مقادیری که با استفاده از مجموعه پارامترهای Command object ارسال شده را نشان میدهد.
C# Code
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; }
این مثال با استفاده از command پارامتر است که از طریق text box (Customer ID) ارائه میشود و نتیجه پردازش شده ، با استفاده از Stored Procedure در فایل کد و نتیجه در کنترل Data Grid View نمایش داده میشود.
کلاس DataSet
DataSet یک تکنولوژی معماری قطع شده است.که شامل چند جدول و روابط است. در مثال زیر ،چگونگی بازیابی اطلاعات از یک جدول SQL سرور و استفاده از آن برای پر کردن یک شی DataTable در DataSet را خواهید دید.
C# Code
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"]; }
در اینجا نیاز به ایجاد یک empty DataSet و استفاده از متد ()SqlDataAdapter Fill برای اجرای کوئری وقرار دادن نتایج DataTable جدید ،در DataSet را دارید.
Provider Agnostic code
شما می توانید از یک شی single factory برای ایجاد هرنوع از شی provider-specific که نیاز دارید، استفاده کنید.
نکته: شما نیاز به افزودن فضای نام System.Data.Common در فایل کد C # دارید.
اولین قدم راه اندازی فایل app.config با connection string، provider name و کوئری که در مثال زیر استفاده شده است.
App.Config
<?xml version="1.0" encoding="utf-8" ?> <configuration> <connectionStrings> <add name="Adventure" connectionString ="Data Source=localhost;Database=AdventureWorksLT2008;Integrated Security=SSPI" /> </connectionStrings> <appSettings> <add key ="factory" value="System.Data.SqlClient" /> <add key="CustQuery" value ="select * from SalesLT.Customer"/> </appSettings> </configuration>
بر اساس کد factory:
C# Code
private void Form1_Load(object sender, EventArgs e) { //Get the Factory string factory = ConfigurationManager.AppSettings["factory"]; DbProviderFactory pro = DbProviderFactories.GetFactory(factory); //Use this factory to create a connection DbConnection con = pro.CreateConnection(); con.ConnectionString = ConfigurationManager.ConnectionStrings["Adventure"].ConnectionString; //Create the command DbCommand cmd = pro.CreateCommand(); cmd.CommandText = ConfigurationManager.AppSettings["CustQuery"]; cmd.Connection = con; //Open the connection con.Open(); DbDataReader rdr = cmd.ExecuteReader(); //Get all records while (rdr.Read()) { textBox1.AppendText(rdr.GetValue(3) + "\t" + rdr.GetValue(5)); textBox1.AppendText("\n"); } }
- C#.net
- 4k بازدید
- 7 تشکر