مشخصات مقاله
-
14533
-
0.0
-
109028
-
0
-
0
اتصال به SQL Server در سی شارپ (SqlConnection)
یادگیری برنامهنویسی فقط با حفظ کردن چند دستور و نوشتن چند خط کد به پایان نمیرسه. برای تبدیل شدن به یک برنامهنویس حرفهای، باید مفاهیم پایه رو بهخوبی یاد بگیری، منطق پشت ابزارها رو درک کنی و با تکنولوژیهایی تمرین کنی که در پروژههای واقعی استفاده میشن. زبان C# یکی از مهمترین زبانهای اکوسیستم مایکروسافته که سالهاست در توسعه نرمافزارهای سازمانی، برنامههای تحت وب، APIها و سیستمهای بزرگ استفاده میشه.
اگه قصد داری مسیر یادگیری برنامهنویسی با C# رو اصولی شروع کنی، آشنایی با مفاهیمی مثل ارتباط با پایگاه داده، مدیریت منابع و کار با ابزارهای استاندارد توسعه اهمیت زیادی داره. مطالعه مباحثی مثل ADO.NET و آموزش C# میتونه پایه مناسبی برای ادامه مسیر و ساخت نرمافزارهای واقعی ایجاد کنه. در ادامه این مقاله با یکی از بخشهای مهم کار با دادهها در C# یعنی SqlConnection آشنا میشیم.
برای اینکه یک برنامه بتونه با پایگاه داده ارتباط برقرار کنه و عملیات مختلفی روی اطلاعات انجام بده، اول باید به اون پایگاه داده متصل بشه. در ADO.NET برای اتصال به پایگاه داده SQL Server از شیء SqlConnection استفاده میکنیم. در این بخش از آموزش سی شارپ قرار است با این شیء و نحوه کار با آن آشنا شویم.
در این درس با مفهوم SqlConnection Object و نحوه برقراری اتصال با پایگاه داده آشنا میشویم. هدفهای اصلی این بخش عبارتاند از:
- آشنایی با شیء اتصال (Connection Object) مورد استفاده
- یادگیری نحوه تعریف یک SqlConnection Object
- بررسی نحوه کار SqlConnection Object در یک اپلیکیشن
- درک اهمیت مدیریت درست طول عمر اتصال (lifetime)
مقدمه
اولین قدم برای ارتباط با یک پایگاه داده، ایجاد یک اتصال (Connection) است. این اتصال به بخشهای مختلف ADO.NET اعلام میکند که برنامه قرار است با کدام پایگاه داده کار کند. همچنین تمام منطقهای سطح پایین مرتبط با پروتکلهای اختصاصی پایگاه داده (specific database protocols) را مدیریت میکند. در عمل، بیشتر کاری که در کدنویسی نیاز داریم انجام دهیم شامل ساخت یک شیء اتصال (connection object)، باز کردن اتصال (Connection) و در پایان بستن آن است. البته در بعضی شرایط خاص ممکن است نیاز به انجام مراحل بیشتری وجود نداشته باشد.
با اینکه کار با اتصالها (Connections) در ADO.NET ساده است، اما وقتی صحبت از کدنویسی دستی برای دسترسی به دادهها (data access routines) میشود، تصمیمگیری درست درباره مدیریت اتصالها اهمیت زیادی پیدا میکند. فرض کنید یک برنامه ساده تککاربره (stand-alone client) دارید که به یک پایگاه داده جداگانه متصل است. در چنین شرایطی معمولاً مدیریت اتصالها چندان پیچیده نیست. اما حالا یک نرمافزار سازمانی را تصور کنید که صدها کاربر در سراسر شرکت همزمان به یک پایگاه داده مشترک دسترسی دارند. هر اتصال (Connection) مقداری سربار ایجاد میکند و تعداد این اتصالها همیشه محدود است. در مقیاسهای بزرگتر، یک وبسایت با صدها هزار کاربر روزانه را در نظر بگیرید. برنامههایی که اتصالها را باز نگه میدارند و بهدرستی آزاد نمیکنند، میتوانند تأثیر منفی زیادی روی عملکرد (Performance) و مقیاسپذیری (Scalability) سیستم داشته باشند.
ایجاد یک SqlConnection Object
یک SqlConnection Object مثل هر شیء دیگری در C# یک شیء معمولی است. در بیشتر مواقع، تمام SqlConnectionها همانطور که در کد زیر میبینید، در یک خط ساخته و مقداردهی میشوند:
SqlConnection conn = new SqlConnection("Data Source=(local);Initial Catalog=Northwind;Integrated Security=SSPI");
SqlConnection Object که در کد بالا مشاهده میکنید، از یک سازنده (Constructor) استفاده میکند که فقط یک آرگومان رشتهای دریافت میکند. این آرگومان یک Connection String یا رشته اتصال نام دارد. رشته اتصال مشخص میکند برنامه چگونه و با چه اطلاعاتی به پایگاه داده متصل شود. در جدول 1 بخشهای مختلف یک Connection String را بررسی میکنیم.
Integrated Security یا امنیت یکپارچه، یکی از روشهای امنیتی است که معمولاً هنگام کار با یک سیستم مستقل استفاده میشود. با این حال در بسیاری از پروژهها، میتوان دسترسیها را با استفاده از یک SQL Server User ID که مخصوص اپلیکیشن تعریف شده است، مدیریت کرد. در تصویر یا کد پایین، یک رشته اتصال را میبینید که به جای Integrated Security از پارامترهای User ID و Password استفاده میکند.
SqlConnection conn = new SqlConnection("Data Source=DatabaseServer;Initial Catalog=Northwind;User ID=YourUserID;Password=YourPassword");
دقت کنید که در این مثال، مقدار Data Source با DatabaseServer تنظیم شده تا بتواند به پایگاه دادهای روی یک سیستم دیگر، شبکه داخلی (LAN) یا حتی اینترنت متصل شود. همچنین User ID و Password جایگزین تنظیمات Integrated Security شدهاند.
استفاده از یک SqlConnection
هدف از ایجاد یک SqlConnection Object این است که بتوانیم سایر بخشهای ADO.NET را برای کار با یک پایگاه داده فعال کنیم. اشیایی مانند SqlCommand و SqlDataAdapter، شیء اتصال (Connection Object) را به عنوان یکی از پارامترهای خود دریافت میکنند. مراحلی که در طول عمر یک SqlConnection اتفاق میافتد شامل موارد زیر است:
- ساخت SqlConnection
- باز کردن اتصال (Connection)
- انتقال اتصال (Connection) به سایر اشیای ADO.NET
- اجرای عملیات پایگاه داده با دیگر اشیای ADO.NET
- بستن اتصال (Connection)
تا اینجا نحوه معرفی یک SqlConnection را دیدیم. مراحل بعدی یعنی باز کردن (Opening)، انتقال دادن (Passing)، استفاده کردن (Using) و بستن (Closing) اتصال در مثال زیر نشان داده شدهاند.
using System; using System.Data; using System.Data.SqlClient; ////// Demonstrates how to work with SqlConnection objects /// class SqlConnectionDemo { static void Main() { // 1. Instantiate the connection SqlConnection conn = new SqlConnection("Data Source=(local);Initial Catalog=Northwind;Integrated Security=SSPI"); SqlDataReader rdr = null; try { // 2. Open the connection conn.Open(); // 3. Pass the connection to a command object SqlCommand cmd = new SqlCommand("select * from Customers", conn); // 4. Use the connection // get query results rdr = cmd.ExecuteReader(); // print the CustomerID of each record while (rdr.Read()) { Console.WriteLine(rdr[0]); } } finally { // close the reader if (rdr != null) { rdr.Close(); } // 5. Close the connection if (conn != null) { conn.Close(); } } } }
همانطور که در لیست 1 مشاهده میکنید، با استفاده از متد Open() در شیء SqlConnection که در اینجا با نام conn تعریف شده است، اتصال به پایگاه داده باز میشود. هر عملیاتی که روی یک اتصال باز نشده انجام شود، باعث ایجاد خطا (exception) خواهد شد. بنابراین قبل از استفاده از اتصال، باید با فراخوانی متد Open() آن را برقرار کنید.
قبل از استفاده از یک SqlCommand، باید به کد ADO.NET مشخص کنیم که این دستور قرار است از کدام اتصال استفاده کند. در لیست دستور 1، شیء SqlConnection که با نام conn مشخص شده، به عنوان پارامتر دوم به SqlCommand ارسال شده است. بنابراین هر دستوری که با این SqlCommand اجرا شود، از همین اتصال برای ارتباط با پایگاه داده استفاده خواهد کرد. در این مثال، یک شیء SqlConnection برای اجرای یک Query روی جدول Customers استفاده میشود. نتیجه اجرای Query به شکل یک SqlDataReader برگردانده میشود و حلقه while مقدار اولین ستون هر رکورد یعنی CustomerID را میخواند. در بخشهای بعدی با SqlCommand و SqlDataReader بیشتر آشنا میشویم. این اشیا با استفاده از SqlConnection میدانند که باید با کدام پایگاه داده ارتباط برقرار کنند.
بعد از اینکه کار با Connection Object تمام شد، باید اتصال را ببندید. نبستن اتصال میتواند تأثیر منفی زیادی روی عملکرد (Performance) و مقیاسپذیری (Scalability) برنامه داشته باشد. در مثال بالا، متد Close() داخل بخش finally فراخوانی شده است تا مطمئن شویم اتصال قبل از بسته شدن، مقدار null ندارد.
در این مثال، کدهای ADO.NET داخل ساختار try/catch/finally قرار گرفتهاند. بخش finally تضمین میکند که یک قسمت مشخص از کد، چه خطایی رخ داده باشد و چه نه، اجرا شود. از آنجا که اتصالها (Connection) منابع ارزشمندی از سیستم مصرف میکنند، باید مطمئن شویم که در بخش finally بهدرستی بسته میشوند.
نکته مهم دیگری که هنگام بستن اتصال باید در نظر بگیریم این است که مطمئن شویم شیء اتصال در وضعیت null قرار ندارد. اگر هنگام نمونهسازی اتصال (Connection) خطایی رخ دهد، مقدار این شیء میتواند null باشد. این مثال نشان میدهد که چگونه میتوان از یک SqlConnection همراه با SqlDataReader استفاده کرد؛ حالتی که در آن باید اتصال را بهصورت دستی مدیریت و در پایان ببندیم. اما زمانی که از مدل disconnected data استفاده میکنیم، دیگر لازم نیست خودمان اتصال را باز و بسته کنیم. در درس آینده که به بررسی SqlDataReader میپردازیم، این موضوع را بیشتر بررسی خواهیم کرد.
خلاصه
اشیای SqlConnection به سایر بخشهای ADO.NET اعلام میکنند که برنامه به کدام پایگاه داده متصل است و چگونه باید این اتصال را برقرار کند. این اشیا با استفاده از یک Connection String که شامل جفتهای کلیدی/مقداری (key/value pairs) است، ساخته میشوند. این مقادیر مشخص میکنند اتصال چگونه ایجاد شود. مراحل اصلی مدیریت طول عمر یک اتصال شامل create، open، pass، use و close است. بستن صحیح اتصال بعد از پایان کار، کمک میکند منابع سیستم بدون دلیل مصرف نشوند و برنامه عملکرد بهتری داشته باشد.
مسیر یادگیری C# را اصولی ادامه دهید
آشنایی با مفاهیمی مثل ADO.NET، اتصال به پایگاه داده و مدیریت دادهها، یکی از بخشهای مهم مسیر تبدیل شدن به یک برنامهنویس C# است. اما برای ساخت نرمافزارهای واقعی، باید این مفاهیم را در کنار موضوعاتی مثل شیگرایی، Entity Framework، طراحی API، کار با دیتابیس و ساخت پروژههای عملی یاد بگیرید.
در دوره آموزش C# آموزشگاه تحلیلداده، تمرکز فقط روی یادگیری دستورات زبان نیست. هدف این است که با تمرین و انجام پروژه، توانایی استفاده از C# در سناریوهای واقعی توسعه نرمافزار را به دست بیاورید و مسیر بعدی یادگیری خود را آگاهانهتر انتخاب کنید.
اگر میخواهید یادگیری C# را از پایه و به شکل پروژهمحور دنبال کنید، جزئیات دوره، سرفصلها و مسیر آموزشی را مشاهده کنید:
خدا خیرت بده.