بررسی اجمالی معماری ADO.NET

جمعه 7 اسفند 1394

ADO.NET به طور عمده برای اتصال به دیتابیس از Reader ، Command ، Adapter و اشیاء Dataset استفاده میکند. در این مقاله درباره معماری ADO.NET صحبت میشود.

بررسی اجمالی  معماری ADO.NET

آنچه در این مقاله ارائه میشود:

 معماری  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 Strings

در یک کلاس 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  مانند زیر بازیابی کنید.

App.Config

    <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");  
        }  
      
    }  

آموزش سی شارپ

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان
  • C#.net
  • 4k بازدید
  • 7 تشکر

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

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید