سلام دوستان خوب ، وقت بخیر، با سری آموزشهای Asp درخدمت شما هستم. امیدوارم که مطالب امروز ما برای شما مفید واقع شود.این درس چگونگی خواندن داده با یک آبجکت SqlDataReader را توضیح می دهد. در اینجا اهداف این درس را مشاهده می کنید.

· یادگیری مورد استفاده ی یک SqlDataReader.

· یادگیری چگونگی خواندن داده با استفاده از یک SqlDataReader

· درک نیاز به بستن یک SqlDataReader

مقدمه:

یک SqlDataReader برای خواندن داده به موثرترین روش ممکن خوب می باشد. شما نمی توانید از آن در نوشتن داده استفاده کنید. SqlDataReader ها معمولا به عنوان جریانات fast-forward firehose-like از داده توصیف می شوند.

شما می توانید از آبجکت های SqlDataReader در یک روش پی در پی forward-only بخوانید. زمانی که داده هایی را خوانده اید، باید آن را ذخیره کنید، زیرا قادر نخواهید بود که به عقب بازگشته و مجددا آن را بخوانید.

طراحی forward only از SqlDataReader آن را سریعتر می سازد. این کار ارتباطی به معکوس کردن داده یا نوشتن آن در پشت منبع داده ندارد. بنابراین اگر تنها شرط لازم شما برای گروهی از داده ها خواندن یک بار آنها می باشد و شما نیز سریعترین روش ممکن را می خواهید، SqlDataReader بهترین انتخاب می باشد. همچنین اگر مقدار داده ای را که می خواهید بخوانید، بزرگتر از مقداری است که در یک فراخوانی مجزا ترجیح می دهید در حافظه نگاه دارید، جریان رفتار SqlDataReader انتخاب خوبی می باشد.

نکته: مشاهده کردید که در پاراگراف قبل، هنگام بحث در مورد دلایل استفاده ی شما از SqlDataReader، از اصطلاح “یک بار” استفاده کردم. درست مانند هر چیز دیگری، استثنا هم وجود دارد. در بسیاری از موارد استفاده از یک DataSet ذخیره شده موثرتر می باشد. در حالیکه ذخیره سازی جنبه ی خارجی این آمورش می باشد، در مورد استفاده از آبجکت های DataSet در بخش بعدی بحث خواهیم کرد.

ایجاد یک آیجکت SqlDataReader:

دریافت یک نمونه از SqlDataReader کمی متفاوت از روشی است که شما آبجکت های دیگر ADO.NET را نمونه گذاری می کنید. شما باید ExecuteReader را روی یک آبجکت دستور فرا بخوانید:

SqlDataReader rdr = cmd.ExecuteReader();

متود ExecuteReader از آبجکت SqlCommand، cmd، یک نمونه SqlDataReader را بازمی گرداند. ایجاد یک SqlDataReader با اپراتور جدید کاری برای شما انجام نمی دهد. همانطور که در بخش های قبلی فرا گرفتید، آبجکت SqlCommand به اتصال اشاره دارد و عبارت SQL برای SqlDataReader لازم می باشد تا داده را برقرار کند.

خواندن داده:

بخش های قبل حاوی کدی بود که از یک SqlDataReader استفاده می کرد، اما بحث به تعویق افتاد، بنابراین می توانیم روی موضوع خاصی از آن درس مشخص تمرکز کنیم. این درس از آنچه دیده اید و توضیحات مربوط به چگونگی استفاده از SqlDataReader تشکیل شده است.

همانطور که قبلا توضیح داده شد، SqlDataReader داده را از طریق یک جریان پی در پی باز می گرداند. برای خواندن این داده، زمانی که یک ردیف خوانده شده است، باید داده را از جدول ردیف به ردیف بکشید. برای خواندن مجدد آن ردیف مجبور هستید یک نمونه ی جدید از SqlDataReader ایجاد کنید و از طریق جریان داده آن را مجددا بخوانید.

متود متداول خواندن از جریان داده، که به وسیله SqlDataReader گزارش شده است، تکرار از طریق هر ردیف با یک while loop می باشد. کد زیر چگونگی تکمیل این کار را نشان می دهد:

while (rdr.Read())‎

‎{‎

‎// get the results of each column‎

string contact = (string)rdr[“ContactName”];‎

string company = (string)rdr[“CompanyName”];‎

string city = (string)rdr[“City”];‎

‎// print out the results‎

Console.Write(“{0,-25}”, contact);‎

Console.Write(“{0,-20}”, city);‎

Console.Write(“{0,-25}”, company);‎

Console.WriteLine();‎

‎}‎

به فراخوانی برای Read روی SqlDataReader, rdr در شرایط while loop در کد بالا دقت داشته باشید. مقدار گزارش شده در Read (خواندن) از نوع bool می باشد و تا زمانیکه رکوردهای بیشتری خواندن وجود داشته باشد، true گزارش می دهد. پس از اینکه آخرین رکورد در جریان داده خوانده شد، Read عبارت false را گزارش می دهد.

در بخش های قبل با استفاده از ایندکسر SqlDataReader اولین ستون را از ردیف استخراج کردیم، به عنوان مثال rdr[0]. شما می توانید هر ستون را با استفاده از یک نمایه ساز عددی (numeric indexer) مانند این مورد استخراج کنید، اما خیلی خوانا نمی باشد. مثال بالا از یک string indexer استفاده می کند، که در آن رشته نام ستون از SQL query می باشد. string indexer ها خواناتر بوده و برقراری کد را آسانتر می سازند.

بدون توجه به نوع پارامتر indexer ، یک SqlDataReader indexer نوع آبجکت را گزارش خواهد داد. به این دلیل است که در مثال بالا نتایج در یک رشته قالب بندی می شوند. زمانی که مقادیر استخراج شدند، شما می توانید هر کاری که می خواهید با آنها انجام دهید، مانند چاپ کردن آنها به خروجی با متودهای نوع Console.

پایان:

همیشه به یاد داشته باشید که SqlDataReader را ببندید، همانطور که لازم است SqlConnection را ببندید. کد دسترسی به داده را در یک try block پیچیده و عملکرد close را بلوک آخر قرار دهید، مانند مثال زیر:

try

‎{‎

‎// data access code‎

‎}‎

finally

‎{‎

‎// ۳٫ close the reader‎

if (rdr != null)‎

‎{‎

rdr.Close();‎

‎}‎

‎// close the connection too‎

‎}‎

کد بالا برای مطمئن شدن از پوچ نبودن SqlDataReader ، آن را چک می کند. پس از اینکه کد می داند یک نمونه SqlDataReader خوب موجود می باشد، می تواند آن را ببندد. لیست ۱ کد را برای بخش های قبل در تمامیت خود نشان می دهد.
Listing 1: Using the SqlDataReader

using System;‎

using System.Data;‎

using System.Data.SqlClient;‎

namespace Lesson04‎

‎{‎

class ReaderDemo

‎{‎

static void Main()‎

‎{‎

ReaderDemo rd = new ReaderDemo();‎

rd.SimpleRead();‎

‎}‎

public void SimpleRead()‎

‎{‎

‎// declare the SqlDataReader, which is used in‎

‎// both the try block and the finally block

SqlDataReader rdr = null;‎

‎// create a connection object‎

SqlConnection conn = new SqlConnection(‎

‎”Data Source=(local);Initial Catalog=Northwind;Integrated Security=SSPI”);‎

‎// create a command object‎

SqlCommand cmd = new SqlCommand(‎

‎”select * from Customers”, conn);‎

try

‎{‎

‎// open the connection‎

conn.Open();‎

‎// ۱٫ get an instance of the SqlDataReader‎

rdr = cmd.ExecuteReader();‎

‎// print a set of column headers‎

Console.WriteLine(‎

‎”Contact Name City Company Name”);‎

Console.WriteLine(‎

‎”———— ———— ————“);‎

‎// ۲٫ print necessary columns of each‎

‎ record

while (rdr.Read())‎

‎{‎

‎// get the results of each column

string contact = (string)rdr[“ContactName”];‎

string company = ‎‎(string)rdr[“CompanyName”];‎

string city = (string)rdr[“City”];‎

‎// print out the results‎

Console.Write(“{0,-25}”, contact);‎

Console.Write(“{0,-20}”, city);‎

Console.Write(“{0,-25}”, company);‎

Console.WriteLine();‎

‎}‎

‎}‎

finally

‎{‎

‎// ۳٫ close the reader‎

if (rdr != null)‎

‎{‎

rdr.Close();‎

‎}‎

‎// close the connection‎

if (conn != null)‎

‎{‎

conn.Close();‎

‎}‎

‎}‎

‎}‎

‎}‎

‎}‎

خلاصه:

آبجکت های SqlDataReader به شما اجازه می دهند تا داده را به یک روش سریع forward-only بخوانید. شما می توانید با خواندن هر ردیف از جریان داده، داده را به دست آورید. متود Close از SqlDataReader را فرابخوانید تا مطمئن شوید هیچگونه نشت منبع وجود ندارد.

امیدوارم که از این بخش لذت برده باشید. بخش بعدی در این مجموعه Lesson 05: Working with Disconnected Data – The DataSet and SqlDataAdapter می باشد.
Working with Disconnected Data – The DataSet and SqlDataAdapter