TehranSat
03-18-08, 11:06 AM
نخستین بخش از این مجموعه به ایجاد اتصال به دیتابیس اختصاص دارد البته در مورد ODBC صحبت نمی کنیم. پیش فرض من در این یادداشت ها این است که خواننده با زبان SQL آشناست و اطلاعات مقدماتی در مورد ado.net و کلاس های دیتا در فریم ورک دات نت را دارد. پس اگر این طور نیست وقت خودتتون را با این مقالات تلف نکنید.البته قسمت اول چیز خاصی نداره و همه می توانند از آن استفاده کنند.
روند کلی برقراری اتصال با دیتابیس
1- رشته اتصال ( connection string ) مناسب را تعریف کنید
2- کلاس مناسب را به برنامه خود وارد ( import ) کنید.
3-یک شی کانکشن تعریف کنید و رشته اتصال را به سازنده آن پاس کنید.
4- شی کانکشن را باز کنید.
5-عملیات مورد نظر را در دیتابیس انجام دهید *
6- شی کانکشن را ببندید.
* برای انجام هر عملیاتی از جمله اضافه یا حذف یا ویرایش یا جستجو باید اشیایی برای انجام آن عملیات از کلاس مربوطه بگیرید که در قسمت های بعدی در موردشان توضیح خواهم داد
چگونه با یک دیتابیس ارتباط برقرار کنیم؟
هدف ایجاد اتصال به یک بانک اطلاعاتی ، باز کردن اتصال و بستن آن است . بر اساس توضیحات بالا گام به گام پیش می رویم :
1- تعریف رشته اتصال : برای برقراری ارتباط با اکسس از رشته اتصالی مثل رشته زیر استفاده می کنیم.
string connectionString ="Provider=Microsoft.Jet.OLEDB.4.0; Ole DB Services=-4; Data Source=C:\\database.mdb";
در رشته اتصال بالا بعد از Data Source آدرس محل قرار گرفتن فایل اکسس خود را مشخص کنید. اگر می خواهید از اس کیو ال سرور استفاده کنید رشته اتصال شما چیزی شبیه به متن زیر خواهد بود :
string connectionString="server=127.0.0.1;database=
MY_DATABASE;UID=MY_USERNAME;PWD=MY_PASSWORD"
در رشته اتصال بالا بعد از server نام و یا ip سرور مورد نظر را وارد می کنید. به MY_DATABASE نام دیتابیس و همین طور نام کاربری و کلمه عبور را برای دسترسی به سرور مشخص کنید.
توجه کنید که رشته های اتصال پارامترهای دیگری هم دارند ولی من ساده ترین مدل را بررسی کردم. برای کسب اطلاعات بیشتر در مورد نحوه نوشتن رشته های اتصال به سایت زیر مراجعه کنید : http://www.connectionstrings.com/
2- اضافه کردن کلاس مناسب به کد صفحه : برای اکسس از System.Data.OleDb استفاده کنید و برای SQL Server از System.Data.SqlClient. اگر از ویژوال استودیو دات نت استفاده می کنید کافی است که آن را به ابتدای کد صفحه اضافه کنید
using System.Data.OleDb;
و اگر کدهای دات نتی را در خود صفحه aspx می نویسید در ابتدای صفحه فضا نام مربوط را import کنید.
3- تعریف شی کانکشن : برای ایجاد این شی در صورت استفاده از System.Data.OleDb خواهیم داشت :
OleDbConnection myConnection=new OleDbConnection ( connectionString );
و اگر از System.Data.SqlClient استفاده کرده اید مطابق مثال زیر به جای OleDbConnection از SqlConnection استفاده می کنید :
SqlConnection myConnection = new SqlConnection( connectionString );
4- باز کردن شی کانکشن : این کار را به کمک متد Open شی کانکشن تعریف شده انجام می دهیم :
myConnection.Open ();
5- انجام عملیات مورد نظر در دیتابیس : در این یادداشت ما هیچ اضافه ، حذف یا ویرایشی را در دیتابیس انجام نمی دهیم.
6 - بستن شی کانکشن : این کار به کمک متد Close انجام می شود.
myConnection.Close ();
دانلود کد نمونه برای SQL Server
این پروژه را به کمک ویژوال استودیو باز کنید ، در کد صفحه WebForm1.aspx مقدار رشته اتصال را بر اساس دیتابیس خود ست کنید. پروژه را مجددا کامپایل و اجرا کنید. در این کد از ساختار Try/Catch استفاده کرده ام ( توضیحات بیشتر در مورد ساختارهای مدیریت استثنا در سی شارپ را در این مقاله بخوانید ) همچنین قبل از بستن کانکشن، به کمک یک عبارت شرطی باز بودن آن را چک می کنم.
در بخش قبل با روش برقراری اتصال با پایگاه داده در ASP.NET آشنا شدید. در این یادداشت با استفاده از یک جدول نمونه ، عملیات اضافه کردن رکورد به دیتابیس را بررسی می کنیم. برای این کار هر دو روش عادی و استفاده از Stored Procedure را پیاده سازی می کنیم. اگر مطالب این یادداشت را به دقت مطالعه و تمرین کنید قادر خواهید بود تا عملیات معمول بانک های اطلاعاتی ( اضافه ، ویرایش و حذف ) را در برنامه های وبی خود انجام دهید چرا که تنها تفاوت این کارها در دستور SQL آنهاست.
افزودن رکورد به بانک اطلاعاتی
روند کلی این است که ابتدا رشته اتصال و عبارت SQL که دستور اضافه کردن را مشخص می کند بنویسید. بعد یک شی دستور بگیرید و پارامترهای مربوطه را به آن شی اضافه کنید. سپس یک کانکشن ایجاد کنید و دستور خود را اجرا کنید و در نهایت کانکشن را ببندید. همین ! حالا اجازه بدهید که این چند سطر را با هم گام به گام انجام دهیم:
گام اول. ساختن دیتابیس و جدول
یک دیتابیس جدید به نام TestDb در SQL Server بسازید. حالا یک جدول به نام Members ایجاد کنید. کد سازنده این جدول را در زیر می بینید ( می توانید اسکریپت ساخت جدول را از اینجا دانلود کنید و پس از ساختن دیتابیس از طریق Query Analyzer آن را اجرا کنید تا جدول را برای شما بسازد )
CREATE TABLE [Members] (
[UserID] [smallint] NOT NULL ,
[Username] [varchar] (10) NOT NULL ,
[Password] [varchar] (20) NOT NULL ,
[Email] [varchar] (50) NOT NULL ,
CONSTRAINT [PK_Members] PRIMARY KEY CLUSTERED
(
[UserID]
) ON [PRIMARY]
) ON [PRIMARY]
Go
گام دوم. تعريف پروژه جدید در ویژوال استودیو
یک پروژه Web Application را در ویژوال استودیو ایجاد کنید. نکته ای که امروز می خواهم به آن اشاره کنم ذخیره کردن رشته اتصال در فایل web.config است. برای این کار کد زیر را به این فایل اضافه کنید ( این کد داخل بلاک نباشد )
به جای YOUR CONNECTION STRING رشته اتصال خود را قرار دهید ( در مورد رشته اتصال در یادداشت قبلی مفصل صحبت کردم )حالا می توانید در هر صفحه ای به کمک کد زیر رشته اتصال ذخیره شده را بازیابی کنید :
string ConnectionString=ConfigurationSettings.AppSettings["connectionstring"];
برای کسب اطلاعات بیشتر در مورد ذخیره کردن رشته اتصال در web.config این مقاله فارسی را بخوانید : ذخيره كردن Connection String در فايل Web.Config
توصیه امنیتی : هر زمان که رشته اتصال خود را به این شکل در web.config ذخیره می کنید بهتر است برای افزایش ایمنی آن را به صورت رمز شده ذخیره کنید. برای اطلاع از چگونگی رمز کردن اطلاعات مقاله فارسی زیر را مطالعه کنید : به رمز درآوردن اطلاعات
گام سوم. نوشتن کد صفحه
در این صفحه ما به سه عدد TextBox به نام های txtUsername و txtPassword و txtEmail نیاز داریم. یک دکمه هم برای ارسال فرم در نظر می گیرم به نام btnAdd . کد اضافه شدن اطلاعات فرم به بانک اطلاعاتی را در رویداد کلیک این دکمه می نویسیم. این کد را در زیر مشاهده می کنید :
private void btnAdd_Click(object sender, System.EventArgs e)
{
string connectionstring=ConfigurationSettings.AppSettings["connectionstring"];
string cText="Insert Into Members (Username,Password,Email ) Values (@Username,@Password,@Email)";
SqlConnection con=new SqlConnection (connectionstring);
SqlCommand cmd=new SqlCommand (cText,con);
cmd.Parameters.Add ("@Username",txtUsername.Text );
cmd.Parameters.Add ("@Password",txtPassword.Text );
cmd.Parameters.Add ("@Email",txtEmail.Text );
con.Open ();
cmd.ExecuteNonQuery ();
con.Close ();
}
فراموش نکنید که Namespace های مورد نیاز را به صفحه اضافه کنید. همان طور که می بینید دستور SQL را مستقیما در کد خود نوشتیم و از طریق پارامترها آن را تکمیل کردیم. دقت کنید که متد Add مربوط به پارامترهای یک شی دستور به چند شکل دیگر هم قابل استفاده است ( مثلا می توانید نوع فیلد جدول یا سایز آن را مشخص کنید ) و این ساده ترین شکل استفاده از این متد است.
نکته برنامه نویسی : ممکن است با این روش نتوانید اطلاعات را به فارسی در دیتابیس خود ذخیره کنید. خوشبختانه آقای نوعی پور یادداشت مفصلی در این مورد نوشته است که مشکل ورود اطلاعات فارسی و راه حل آن را به طور کامل بررسی می کند. این یادداشت را می توانید از اینجا بخوانید : پاسخ به يک پرسش متداول برنامهنويسان مبتدي ASP.NET : فارسي در SQL Server
نکته امنیتی : در یک سیستم واقعی کلمه عبور را قبل از اضافه کردن به دیتابیس رمز کنید تا در صورتی که هکر به دیتابیس دسترسی پیدا کرد نتواند کلمات عبور کاربران سیستم را پیدا کند. مطمئن ترین روش Hash کردن کلمات عبور است. در این مورد به زودی مطلبی خواهم نوشت.
استفاده از Stored Procedure
همان طور که در ابتدای این یادداشت ها هم گفتم پیش فرض من این است که شما مفاهیم اصلی مربوط به کار با پایگاه داده و از جمله زبان SQL را می دانید. استفاده از روال های ذخیره شده کارآیی و سرعت سیستم را بالا می برد. وقتی یک روال ذخیره شده را در دیتابیس قرار می دهیم برای مراجعات بعدی دیگر پارسر و کامپایلر آن را بررسی نمی کنند و از نسخه کامپایل شده بهینه آن استفاده می کنند. به علاوه با کمک Transact-SQL می توانیم رویه های ذخیره شده پیشرفته ای را بنویسیم یا مثلا یک سری دستور را به صورت گروهی اجرا کنیم.
برای مثالی که در این یادداشت با آن روبرو بودیم Stored Procedure زیر که همان کار افزودن رکورد را انجام می دهد می نویسیم ( این روال را از طریق Query Analyzer در دیتابیس TestDb اجرا کنید تا به مجموعه روال های ذخیره شده این دیتابیس اضافه شود )
Create Procedure InsertProc
(
@Username varchar(10),
@Password varchar (20),
@Email varchar (50)
)
As
Insert Into Members (Username,Password,Email ) Values (@Username,@Password,@Email)
حالا برای این که عملیات را با استفاده از این روال ذخیره شده انجام دهیم شی دستور SQL را به صورت زیر بازنویسی می کنیم ( قسمت های Bold شده را نگاه کنید ) :
private void btnAdd_Click(object sender, System.EventArgs e)
{
.....
SqlCommand cmd=new SqlCommand ();
cmd.CommandType=System.Data.CommandType.StoredProc edure;
cmd.CommandText="InsertProc";
cmd.Parameters.Add ("@Username",txtUsername.Text );
....
}
در این روش دیگر نیازی به تعریف cText ( همان دستور SQL ) نداریم چرا که این دستور را در داخل رویه ذخیره شده خود نوشته ایم. همان طور که می بینید ابتدا Type دستور را مشخص کردیم و سپس نام رویه ذخیره شده خود را به ویژگی CommandText شی دستور نسبت دادیم.
دانلود فایل پروژه : پروژه دات نتی مربوط به این یادداشت را از این آدرس می توانید دانلود کنید. برای استفاده از این پروژه بعد از ساخت دیتابیس و جدول مربوطه، در فایل Web.Config رشته اتصال خود را به جای عبارت YOUR CONNECTION STRING قرار دهید ( توضیحات گام دوم را بخوانید ). سپس پروژه را کامپایل و اجرا کنید.
.
حل مشکل Login Fails در SQL Server
قسمت اول مجموعه یادداشت های کار با پایگاه داده در ASP.NET به چگونگی برقراری ارتباط با بانک اطلاعاتی اختصاص داشت. یکی از مشکلاتی که ممکن است هنگام برقراری ارتباط با بانک اطلاعاتی به آن برخورد کنید مشکل شکست در لاگین یا Login Fails هست. اگر چنین خطایی را هنگام کار با برنامه وبی خود دریافت کرده اید این یادداشت در رفعش می تواند به شما کمک کند.
موضوع اصلی این است که شما برای دیتابیس های مختلف SQL Server می توانید کاربر تعریف کنید و به هر کاربر سطح دسترسی خاصی بدهید. مثلا کاربری را با سطح خواندنی در نظر بگیرید و رشته اتصال خود را زمانی که قرار است تنها گزارش گیری از بانک اطلاعاتی داشته باشید ( و نمی خواهید هیچ اطلاعاتی اضافه، حذف یا ویرایش کنید ) با استفاده از این کاربر تعریف کنید. SQL Server نقش ها ( Roles ) های مختلفی را در اختیار شما قرار می دهد مثلا : db_owner یا db_datareader و ... .
هنگامی که دات نت فریم ورک را نصب می کنید یک یوزر جدید به ویندوز شما اضافه می شود. برای کار با پایگاه داده نیاز دارید که به این یوزر اجازه دسترسی به دیتابیس خود را بدهید. برای این کار مراحل زیر را دنبال کنید :
Enterprise Manager را باز کنید و به بخش Security بروید. روی قسمت Logins کلیک راست کنید و New Login را انتخاب کنید. پنجره جدیدی باز می شود. در برگه General این پنجره و از بخش Name با کلیک بر روی دکمه ای که در سمت راست هست ( برای browse کردن ) پنجره ای باز می شود که حاوی لیست تمام یوزرهای موجود روی سرور است. یوزر ASPNET را پیدا کنید و روی دکمه Add کلیک کنید. سپس Ok کنید. دوباره به پنجره New Login برمی گردید. در بخش Authentication گزینه Windows Authentication را انتخاب کنید. چیزهای دیگری که شاید مایل به تغییرشان باشید زبان و دیتابیس پیش فرض برای این یوزر است. به کمک برگه Server Roles می توانید نقش این یوزر در سرور را مشخص کنید. و در نهایت به کمک برگه Database Access دیتابیس هایی که می خواهید یوزر ASPNET به آن ها دسترسی داشته باشد را مشخص کنید ( به همراه نقش های مورد نظر ). با کلیک بر روی Ok یوزر ASPNET به مجموعه یوزرهای SQL Server و نیز دیتابیس هایی که مشخص کرده اید اضافه می شود. بعدا می توانید داخل هر دیتابیس از طریق بخش Users میزان دسترسی به جداول را نیز کنترل کنید. این تصویر هم پنجره های مورد نظر این کار را نشان می دهد.
نگاهی به نسخه جدید SQL Server 2005
عرضه شدن نسخه 2005 پایگاه دادهای مشهور مایکروسافت یعنی SQLServer، بازار نرمافزارهای بانک اطلاعاتی را به شدت تحت تأثیر خود قرار داد. امکانات گستردهای که در این نسخه جدید تعبیه شده، طراحی و پیادهسازی بانکهای اطلاعاتی را سرعت بخشیده و تلفیق و انطباق آن با انواع فناوریهای نو مانند XML وADO.NET، باعث افزایش قدرت و کارایی آن شده است. در این مقاله به برخی از ویژگیهای جدید این برنامه نگاهی خواهیم داشت.
Snapshot Isolation Level
یکی از روشهایی که به انواع متدهای قفل کردن ردیفهای یک جدول بانکاطلاعاتی در نسخه جدید اضافه شده است، شیوه تصویربرداری از رکورد است. در روشهای قبلی، اگر یک یا چند رکورد بانک اطلاعاتی توسط دستور BeginTrans که شروع یک فرآیند را مشخص میکند در شرف تغییر یا حذف قرار میگرفتند، تا مادامی که فرآیند مذکور توسط دستور Commit Trans تأیید یا توسط RollBack منتفی نشود، از هیچ جا و برنامهای نمیتوان رکوردهای مذکور را حتی با دستور ساده SELECT خواند. اما در روش جدید قفلگذاری، در صورت بروز چنین رویدادی سایر کاربران میتوانند همواره آخرین ارزش رکوردهای مذکور را با این فرض که هنوز هیچ تغییری در آنها ایجاد نشده است بخوانند و مورد استفاده قرار دهند.
باز هم داتنت
با نسخه جدید SQL Server، برنامهنویسان بانکهای اطلاعاتی قادرند از امکانات و قابلیتهای موجود در پلتفرم داتنت و کلیه توابع و کلاسهای ساخته شده در آن بهرهمند شوند. یکی از ابتداییترین و در عین حال اساسیترین این قابلیتها، امکان استفاده از دو زبان مهم و کاربرپسند داتنت یعنی ویژوال بیسیک و سیشارپ در پیادهسازی اجزای مختلف یک بانکاطلاعاتی است. این عامل نهتنها باعث میشود که برنامهنویسان برای نوشتن ماژولهایی مثل تریگرها، روالها (Stored Procedures) در توابع به جای استفاده از زبان استاندارد و در عین حال پیچیده T-SQL ، بتوانند از زبانهای محیط داتنت با تمام ساختارها، دستورات، کلاسها، آرایهها، و خلاصه تمام ویژگیهای یک زبان شی گرا استفاده کنند، بلکه این همکاری نزدیک بین موتور برنامهنویسی داتنت یعنی CLR (که مسؤول تبدیل کدهای نوشته شده داتنت به زبان سیستمعامل است) و موتور بانک اطلاعاتی SQLServer باعث شده تا به غیر از تنوع زبانهای برنامهنویسی قابل استفاده درSQLServer، تغییر قابل توجهی نیز در کارایی ماژولهای مذکور پیش آید. در واقع موضوع از این قرار است که اصولاً کدهای نوشته شده به زبانهای داتنت، ابتدا توسط کامپایلر به زبان (IL) ترجمه میشوند. سپس CLR این کد میانی را به کد قابل فهم سیستمعامل تبدیل و آماده اجرا مینماید. این کار سبب میشود تا کدهای نهایی به دلیل اینکه بسیار به سیستمعامل نزدیک میباشد سریعتر از کدهای TSQL (که فقط توسط موتور بانک اطلاعاتی قابل اجرا هستند) اجرا شوند و در زمان اجرا از کارایی بیشتری برخوردار باشند. البته این مسأله بدین معنی نیست که استفاده از زبانهای داتنت همیشه بر زبانهای SQL ارجحیت دارد، بلکه منظور آن است که در برخی موارد ممکن است آن قدر منطق و الگوریتم یک ماژول پیچیده باشد که برنامهنویس استفاده از زبانهای داتنت را به دلیل آسانتر بودن ساختار و دستورات آن به زبان SQL ترجیح دهد. بنابراین زمانی که بیشترعملیات یک ماژول مربوط به خواندن و نوشتن اطلاعات باشد بهتر است از همان دستورات استاندارد SQL یعنی SELECT ،UPDATE ،DELETE وINSERT استفاده کرده و بیجهت منابع سیستم را صرف تعریف متغیرها و کلاسهای داتنت ننماید. اما در ماژولهایی که بیشتر عملیاتشان شامل پردازش اطلاعات مثل انجام عملیاتهای ریاضی یا مقایسه اطلاعات با یکدیگر است بهتر است تا هم از امکانات برنامهنویسی و هم از سرعت و کارایی بالای داتنت در این زمینه بهره برد و ماژولهای مذکور را با زبانهای داتنت پیادهسازی کرد.
ADO .NET وارد میشود
طبق یک سنت نهچندان قدیمی برنامهنویسی در محیط ویندوز، برنامهنویسان SQLServer، بانک اطلاعاتی موردنظرشان را برروی سرور و برنامه کاربردی نوشته شده با زبانی مثل ویژوال بیسیک را بر روی کلاینتها قرار میدهند. سپس از طریق این برنامه کاربردی و با استفاده از اشیایی از جنس ADO دادههای موردنیاز خود را از سمت سرور دریافت کرده و یا به آن ارسال میکنند. اکنون این ارتباط به لطف نسخه جدید SQLServer و همچنین محیط داتنت، با امکانات جدیدADO.NET بسیار کاملتر از قبل شده است. این ارتباط جدید با استفاده از مکانیسمی به نام اعلان (Notification) به یک ارتباط دوطرفه فعال تبدیل شده به طوری که ADO.NET قادر است پیغامهایی را از سمت پایگاه داده به سمت کلاینت ارسال کند. به عنوان مثال فرض کنید که شما با استفاده ازADO تعدادی از رکوردهای یک جدول بانک اطلاعاتی را انتخاب کرده و مشغول کار برروی آنها هستید. در همین هنگام کاربر دیگری از طریق کلاینت و ADO خود، رکوردی در محدوده رکوردهای مورد انتخاب شما را تغییر میدهد یا حذف میکند. در این وقت موتور پایگاه داده با ارسال پیغامی به ADO شما، این مسأله را با استفاده از فراخوانی یک رخداد (Event) شی ADO به اطلاعتان میرساند.
علاوه براین قابلیت جدید، فناوری جدید دیگری هم با استفاده ازADO.NET به نسخه جدید SQLServer اضافه شده و آن امکان چند پرسوجوی همزمان توسط یک شی ADO است. در این شیوه اگر یک شی ADO با استفاده از دستور SELECT مشغول خواندن تعدادی از رکوردهای یک جدول بانک اطلاعاتی باشد، میتواند بدون اینکه منتظر به پایان رسیدن این عملیات شود، تعداد دیگری از رکوردهای یک جدول دیگر بانک اطلاعاتی را بخواند. این قابلیت جدید با نام (Multiple Active Result Set (MARS که قبلاً فقط در کرسرهای سمت سرور (server side) و آن هم نه با کارایی بالا وجود داشت اکنون در کرسرهای سمت راست کلاینت هم وجود دارد و تفاوت عمده آن با شکل قدیمی هم علاوه بر مورد مذکور، امکان ایجاد چند کرسر در یک شی ADO به صورت همزمان است. SQLServer نسخه 2005 به خوبی از تمام این ویژگیها، پشتیبانی میکند.
تکنولوژی XML
اکنون که XML به یک استاندارد ارتباطی بین سکوهای مختلف تبدیل شده است، نسخه جدید SQLServer هم از توجه کافی به آن و ایجاد یک انقلاب در سادهتر استفاده کردن از آن طفره نرفته است. در نسخه 2000 کاربران قادر بودند تا با استفاده از دستور FOR XML نتیجه یک پرسوجوی SELECT از یک بانک اطلاعاتی را به درون یک فایل XML بریزند یا مثلاً با دستور OPEN XML میتوانستند یک فایل XML را باز کرده و شروع به خواندن دستورات درون آن نمایند.
از آنجا که در نسخه جدید SQLServer توجه خاصی به این استاندارد و زبان ارتباطی شده است، یک نوع داده جدید (Data type) به انواع دادههای قبلی و استاندارد SQL مثل int ، char و امثال آن اضافه شده است. این نوع داده جدید که XML نام دارد و دارای خصوصیات یک نوع داده موجود در یک محیط شیگرا است، دارای متدهای پیشرفتهای چون ()nodes() ،Value() ،exist() ،query و ()modify بوده و قادر است انواع پردازشهای قابل انجام برروی اسناد XML را به راحتی انجام دهد. عملیات جستجو، تغییر، حذف و درج مقادیر موردنظر در داخل یک فایل XML را میتوان با استفاده از متدهای مذکور و صرفاً با چند خط برنامهنویسی انجام داد. همچنین در این نسخه برخلاف نسخه 2000، با استفاده از دستور FOR XML میتوان یک شیء از جنس XML را بدون ارسال آن به کلاینت، برروی سرور ساخته و از آن نگهداری کرد. با این کار میتوان جداولی را که مرتباً مورد رجوع کاربران قرار میگیرند هراز گاهی در قالب XML به داخل حافظه آورد و کاربران مذکور به جای رجوع به جداول اصلی در هارددیسک، با استفاده از دستورات ویژه جستجو درXML ، متغیر مذکور را در حافظه سرور مورد جستجو قرار دهند و بدینوسیله یک نوع عمل Cache کردن را جهت افزایش سرعت دسترسی به اطلاعات تکراری شبیهسازی کنند. در این حالت، کاربران به جای استفاده از دستورSELECT استاندارد میتوانند از OPEN XML که در نسخه 2005 قادر است متغیرهای جدید از نوع XML را بخواند استفاده کرده و به سرعت به اطلاعات موردنیاز خود دسترسی پیدا کنند. این قابلیت جدید آنقدر در سریعتر کردن جستجو در برنامههای تحت وب مهم و مؤثر است که جای هیچ مشکلی را در استفاده از آن باقی نمیگذارد.
سرویس اعلان (Notification)
همانطور که گفتیم سیستم اعلان درSQLServer قادر است پیغامهایی را طی زمانهای مشخص به سمت کاربران بفرستد. مثلاً تصور کنید که تعدادی کاربر در حال اتصال به یک بانک حاوی اطلاعات مربوط به ارزش سهام در بورس هستند. از آنجایی که ممکن است قیمت سهام هر شرکت یا مؤسسه برای تعدادی از کاربران از اهمیت زیادی برخوردار باشد، میتوان این سیستم را طوری تنظیم کرد تا هرگاه ارزش سهام خاصی که موردنظر هر کاربر است تغییر کرد، به صورت اتوماتیک به وی اعلام شود. کاربر هم میتواند این تغییرات را برروی برنامه کاربردی خود، تلفن همراه (در قالب Windows Messenger ،(SMS و یا ایمیل بهصورت مرتب دریافت و مشاهده کند.
سرویس گزارشگیری
سرویس جدید تولید گزارشهای متنوع در نسخه 2005 به یکی از جالبترین و پرکاربردترین قابلیتهای این نسخه تبدیل شده است، وجود یک موتور گزارشگر قوی در سمت سرور و یک ابزار مناسب ساخت گزارش با واسط کاربر عالی، باعث شده تا برنامهنویسان بتوانند گزارشهای موردنظر خود را با کارایی و سرعت مناسب در سمت سرور بسازند به طوری که این گزارشهای سمت سرور توسط هر برنامه کاربردی سمت کلاینت در هر پلتفرمی با همان امکانات اتصال به SQLServer قابل مشاهده است.
بهبودهای ایجاد شده در زبان
در 2005 SQLServer تغییرات بسیار مثبتی در زبان SQL T ایجاد شده است. این تغییرات در زمینههای مختلف مثل مدیریت خطاها، جستجوهای بازگشتی (Recursive Query) و حتی در بدنه موتور پایگاه دادهها انجام شده و کارایی کلی ذخیره و یا خواندن اطلاعات را به نحو مطلوبی افزایش داده است. به عنوان مثال دردستورات
TSQL، دو اپراتور جدید دیده میشود، که PIVOT وUNPIVOT نام دارند. این دو اپراتور که در قسمت FROM یک پرسوجو مورد استفاده قرار میگیرند میتوانند نتیجه یک جستجوی انجام شده توسط دستور SELECT را به جای برگرداندن در قالب ردیفها یا رکوردهای پشتسرهم، به صورت ستونهای مختلف یک یا چند رکورد برگردانند. در این روش یکی از ستونهای (فیلدهای) یک جستجو به عنوان محور معرفی شده و بقیه ستونها براساس آن به صورت افقی طبقهبندی میشوند. به یک مثال توجه کنید:
SELECT CUSTOMER ID, order No
FROM orders PIVOT CustomerID
Order No Order No Order No Order No Customer ID
4400 1120 25 1
350 2
1780 443 3
8989 2222 1980 555 4
نتیجه جستجوی فوق چیزی شبیه جدول بالا خواهد بود
همانطور که مشاهده میکنید با استفاده از اپراتور مذکور، نتیجه پرسوجوی انجام شده به این صورت که هر ردیف به یک شماره مشتری و چندین شماره سفارش مربوطه به آن مشتری در قالب ستونهای مختلف است، در میآید. این همان چیزی است که سالها درSQLServer وجود نداشت و ابزارهای مختلف گزارشسازی مثل CrystalReport آن را با نام Cross Tab به کاربران خود ارایه میدادند. در همین رابطه اپراتورUNPIVOT هم عمل عکس اپراتور مذکور را انجام میدهد.
اپراتور دیگری که میتواند نقش مهمی را در دستورات SQL بازی کند APPLY نام دارد که در قسمت FROM یک دستور SQL به کار میرود. با استفاده از این دستور میتوان خروجی یک تابع (Function) را با یک یا چند جدول دیگر ترکیب (Join) کرد همانطور که میدانید در 2005 SQLServer توابع میتوانند یک یا چند ردیف یک جدول اطلاعاتی را برگردانند که این خروجی میتواند با یک جدول دیگر با استفاده از اپراتور مذکور ترکیب شود.
مدیریت خطا
در نسخههای قدیمی SQLServer برای کشف و مدیریت خطا از سیستم Error Handling استفاده میشد. این شیوه کشف خطا که در زبانی مثل ویژوال بیسیک 6 هم مورد استفاده قرار میگرفت با استفاده از دستور GOTO میتوانست کنترل و خط اجرای روال را از یک محل به محل دیگر و در واقع از محل بروز خطا به محل مدیریت و آشکار کردن (Raise) آن ببرد و بدینوسیله پیغام خطایی را به کار نشان دهد. نسخه جدید SQLServer با تأثیر از پلتفرم داتنت، از دستورات ویژه کشف و مدیریت خطا با عنوان Exception Handling استفاده میکند. این روش با استفاده از دستورات جدید TRY/CATCH شیوه بهتری از مدیریت خطا را به اجرا میگذارد. در این روش برخلاف روش قبل، تمام خطاهای اتفاقافتادنی مثل خطاهای مربوط به تبدیل دادهها به یکدیگر (DataConversion) به خوبی مدیریت شده و از بروز خطاهایی که منجر به اتمام ناقص عملیات یک روال یا تریگر میشود جلوگیری به عمل میآید.
روند کلی برقراری اتصال با دیتابیس
1- رشته اتصال ( connection string ) مناسب را تعریف کنید
2- کلاس مناسب را به برنامه خود وارد ( import ) کنید.
3-یک شی کانکشن تعریف کنید و رشته اتصال را به سازنده آن پاس کنید.
4- شی کانکشن را باز کنید.
5-عملیات مورد نظر را در دیتابیس انجام دهید *
6- شی کانکشن را ببندید.
* برای انجام هر عملیاتی از جمله اضافه یا حذف یا ویرایش یا جستجو باید اشیایی برای انجام آن عملیات از کلاس مربوطه بگیرید که در قسمت های بعدی در موردشان توضیح خواهم داد
چگونه با یک دیتابیس ارتباط برقرار کنیم؟
هدف ایجاد اتصال به یک بانک اطلاعاتی ، باز کردن اتصال و بستن آن است . بر اساس توضیحات بالا گام به گام پیش می رویم :
1- تعریف رشته اتصال : برای برقراری ارتباط با اکسس از رشته اتصالی مثل رشته زیر استفاده می کنیم.
string connectionString ="Provider=Microsoft.Jet.OLEDB.4.0; Ole DB Services=-4; Data Source=C:\\database.mdb";
در رشته اتصال بالا بعد از Data Source آدرس محل قرار گرفتن فایل اکسس خود را مشخص کنید. اگر می خواهید از اس کیو ال سرور استفاده کنید رشته اتصال شما چیزی شبیه به متن زیر خواهد بود :
string connectionString="server=127.0.0.1;database=
MY_DATABASE;UID=MY_USERNAME;PWD=MY_PASSWORD"
در رشته اتصال بالا بعد از server نام و یا ip سرور مورد نظر را وارد می کنید. به MY_DATABASE نام دیتابیس و همین طور نام کاربری و کلمه عبور را برای دسترسی به سرور مشخص کنید.
توجه کنید که رشته های اتصال پارامترهای دیگری هم دارند ولی من ساده ترین مدل را بررسی کردم. برای کسب اطلاعات بیشتر در مورد نحوه نوشتن رشته های اتصال به سایت زیر مراجعه کنید : http://www.connectionstrings.com/
2- اضافه کردن کلاس مناسب به کد صفحه : برای اکسس از System.Data.OleDb استفاده کنید و برای SQL Server از System.Data.SqlClient. اگر از ویژوال استودیو دات نت استفاده می کنید کافی است که آن را به ابتدای کد صفحه اضافه کنید
using System.Data.OleDb;
و اگر کدهای دات نتی را در خود صفحه aspx می نویسید در ابتدای صفحه فضا نام مربوط را import کنید.
3- تعریف شی کانکشن : برای ایجاد این شی در صورت استفاده از System.Data.OleDb خواهیم داشت :
OleDbConnection myConnection=new OleDbConnection ( connectionString );
و اگر از System.Data.SqlClient استفاده کرده اید مطابق مثال زیر به جای OleDbConnection از SqlConnection استفاده می کنید :
SqlConnection myConnection = new SqlConnection( connectionString );
4- باز کردن شی کانکشن : این کار را به کمک متد Open شی کانکشن تعریف شده انجام می دهیم :
myConnection.Open ();
5- انجام عملیات مورد نظر در دیتابیس : در این یادداشت ما هیچ اضافه ، حذف یا ویرایشی را در دیتابیس انجام نمی دهیم.
6 - بستن شی کانکشن : این کار به کمک متد Close انجام می شود.
myConnection.Close ();
دانلود کد نمونه برای SQL Server
این پروژه را به کمک ویژوال استودیو باز کنید ، در کد صفحه WebForm1.aspx مقدار رشته اتصال را بر اساس دیتابیس خود ست کنید. پروژه را مجددا کامپایل و اجرا کنید. در این کد از ساختار Try/Catch استفاده کرده ام ( توضیحات بیشتر در مورد ساختارهای مدیریت استثنا در سی شارپ را در این مقاله بخوانید ) همچنین قبل از بستن کانکشن، به کمک یک عبارت شرطی باز بودن آن را چک می کنم.
در بخش قبل با روش برقراری اتصال با پایگاه داده در ASP.NET آشنا شدید. در این یادداشت با استفاده از یک جدول نمونه ، عملیات اضافه کردن رکورد به دیتابیس را بررسی می کنیم. برای این کار هر دو روش عادی و استفاده از Stored Procedure را پیاده سازی می کنیم. اگر مطالب این یادداشت را به دقت مطالعه و تمرین کنید قادر خواهید بود تا عملیات معمول بانک های اطلاعاتی ( اضافه ، ویرایش و حذف ) را در برنامه های وبی خود انجام دهید چرا که تنها تفاوت این کارها در دستور SQL آنهاست.
افزودن رکورد به بانک اطلاعاتی
روند کلی این است که ابتدا رشته اتصال و عبارت SQL که دستور اضافه کردن را مشخص می کند بنویسید. بعد یک شی دستور بگیرید و پارامترهای مربوطه را به آن شی اضافه کنید. سپس یک کانکشن ایجاد کنید و دستور خود را اجرا کنید و در نهایت کانکشن را ببندید. همین ! حالا اجازه بدهید که این چند سطر را با هم گام به گام انجام دهیم:
گام اول. ساختن دیتابیس و جدول
یک دیتابیس جدید به نام TestDb در SQL Server بسازید. حالا یک جدول به نام Members ایجاد کنید. کد سازنده این جدول را در زیر می بینید ( می توانید اسکریپت ساخت جدول را از اینجا دانلود کنید و پس از ساختن دیتابیس از طریق Query Analyzer آن را اجرا کنید تا جدول را برای شما بسازد )
CREATE TABLE [Members] (
[UserID] [smallint] NOT NULL ,
[Username] [varchar] (10) NOT NULL ,
[Password] [varchar] (20) NOT NULL ,
[Email] [varchar] (50) NOT NULL ,
CONSTRAINT [PK_Members] PRIMARY KEY CLUSTERED
(
[UserID]
) ON [PRIMARY]
) ON [PRIMARY]
Go
گام دوم. تعريف پروژه جدید در ویژوال استودیو
یک پروژه Web Application را در ویژوال استودیو ایجاد کنید. نکته ای که امروز می خواهم به آن اشاره کنم ذخیره کردن رشته اتصال در فایل web.config است. برای این کار کد زیر را به این فایل اضافه کنید ( این کد داخل بلاک نباشد )
به جای YOUR CONNECTION STRING رشته اتصال خود را قرار دهید ( در مورد رشته اتصال در یادداشت قبلی مفصل صحبت کردم )حالا می توانید در هر صفحه ای به کمک کد زیر رشته اتصال ذخیره شده را بازیابی کنید :
string ConnectionString=ConfigurationSettings.AppSettings["connectionstring"];
برای کسب اطلاعات بیشتر در مورد ذخیره کردن رشته اتصال در web.config این مقاله فارسی را بخوانید : ذخيره كردن Connection String در فايل Web.Config
توصیه امنیتی : هر زمان که رشته اتصال خود را به این شکل در web.config ذخیره می کنید بهتر است برای افزایش ایمنی آن را به صورت رمز شده ذخیره کنید. برای اطلاع از چگونگی رمز کردن اطلاعات مقاله فارسی زیر را مطالعه کنید : به رمز درآوردن اطلاعات
گام سوم. نوشتن کد صفحه
در این صفحه ما به سه عدد TextBox به نام های txtUsername و txtPassword و txtEmail نیاز داریم. یک دکمه هم برای ارسال فرم در نظر می گیرم به نام btnAdd . کد اضافه شدن اطلاعات فرم به بانک اطلاعاتی را در رویداد کلیک این دکمه می نویسیم. این کد را در زیر مشاهده می کنید :
private void btnAdd_Click(object sender, System.EventArgs e)
{
string connectionstring=ConfigurationSettings.AppSettings["connectionstring"];
string cText="Insert Into Members (Username,Password,Email ) Values (@Username,@Password,@Email)";
SqlConnection con=new SqlConnection (connectionstring);
SqlCommand cmd=new SqlCommand (cText,con);
cmd.Parameters.Add ("@Username",txtUsername.Text );
cmd.Parameters.Add ("@Password",txtPassword.Text );
cmd.Parameters.Add ("@Email",txtEmail.Text );
con.Open ();
cmd.ExecuteNonQuery ();
con.Close ();
}
فراموش نکنید که Namespace های مورد نیاز را به صفحه اضافه کنید. همان طور که می بینید دستور SQL را مستقیما در کد خود نوشتیم و از طریق پارامترها آن را تکمیل کردیم. دقت کنید که متد Add مربوط به پارامترهای یک شی دستور به چند شکل دیگر هم قابل استفاده است ( مثلا می توانید نوع فیلد جدول یا سایز آن را مشخص کنید ) و این ساده ترین شکل استفاده از این متد است.
نکته برنامه نویسی : ممکن است با این روش نتوانید اطلاعات را به فارسی در دیتابیس خود ذخیره کنید. خوشبختانه آقای نوعی پور یادداشت مفصلی در این مورد نوشته است که مشکل ورود اطلاعات فارسی و راه حل آن را به طور کامل بررسی می کند. این یادداشت را می توانید از اینجا بخوانید : پاسخ به يک پرسش متداول برنامهنويسان مبتدي ASP.NET : فارسي در SQL Server
نکته امنیتی : در یک سیستم واقعی کلمه عبور را قبل از اضافه کردن به دیتابیس رمز کنید تا در صورتی که هکر به دیتابیس دسترسی پیدا کرد نتواند کلمات عبور کاربران سیستم را پیدا کند. مطمئن ترین روش Hash کردن کلمات عبور است. در این مورد به زودی مطلبی خواهم نوشت.
استفاده از Stored Procedure
همان طور که در ابتدای این یادداشت ها هم گفتم پیش فرض من این است که شما مفاهیم اصلی مربوط به کار با پایگاه داده و از جمله زبان SQL را می دانید. استفاده از روال های ذخیره شده کارآیی و سرعت سیستم را بالا می برد. وقتی یک روال ذخیره شده را در دیتابیس قرار می دهیم برای مراجعات بعدی دیگر پارسر و کامپایلر آن را بررسی نمی کنند و از نسخه کامپایل شده بهینه آن استفاده می کنند. به علاوه با کمک Transact-SQL می توانیم رویه های ذخیره شده پیشرفته ای را بنویسیم یا مثلا یک سری دستور را به صورت گروهی اجرا کنیم.
برای مثالی که در این یادداشت با آن روبرو بودیم Stored Procedure زیر که همان کار افزودن رکورد را انجام می دهد می نویسیم ( این روال را از طریق Query Analyzer در دیتابیس TestDb اجرا کنید تا به مجموعه روال های ذخیره شده این دیتابیس اضافه شود )
Create Procedure InsertProc
(
@Username varchar(10),
@Password varchar (20),
@Email varchar (50)
)
As
Insert Into Members (Username,Password,Email ) Values (@Username,@Password,@Email)
حالا برای این که عملیات را با استفاده از این روال ذخیره شده انجام دهیم شی دستور SQL را به صورت زیر بازنویسی می کنیم ( قسمت های Bold شده را نگاه کنید ) :
private void btnAdd_Click(object sender, System.EventArgs e)
{
.....
SqlCommand cmd=new SqlCommand ();
cmd.CommandType=System.Data.CommandType.StoredProc edure;
cmd.CommandText="InsertProc";
cmd.Parameters.Add ("@Username",txtUsername.Text );
....
}
در این روش دیگر نیازی به تعریف cText ( همان دستور SQL ) نداریم چرا که این دستور را در داخل رویه ذخیره شده خود نوشته ایم. همان طور که می بینید ابتدا Type دستور را مشخص کردیم و سپس نام رویه ذخیره شده خود را به ویژگی CommandText شی دستور نسبت دادیم.
دانلود فایل پروژه : پروژه دات نتی مربوط به این یادداشت را از این آدرس می توانید دانلود کنید. برای استفاده از این پروژه بعد از ساخت دیتابیس و جدول مربوطه، در فایل Web.Config رشته اتصال خود را به جای عبارت YOUR CONNECTION STRING قرار دهید ( توضیحات گام دوم را بخوانید ). سپس پروژه را کامپایل و اجرا کنید.
.
حل مشکل Login Fails در SQL Server
قسمت اول مجموعه یادداشت های کار با پایگاه داده در ASP.NET به چگونگی برقراری ارتباط با بانک اطلاعاتی اختصاص داشت. یکی از مشکلاتی که ممکن است هنگام برقراری ارتباط با بانک اطلاعاتی به آن برخورد کنید مشکل شکست در لاگین یا Login Fails هست. اگر چنین خطایی را هنگام کار با برنامه وبی خود دریافت کرده اید این یادداشت در رفعش می تواند به شما کمک کند.
موضوع اصلی این است که شما برای دیتابیس های مختلف SQL Server می توانید کاربر تعریف کنید و به هر کاربر سطح دسترسی خاصی بدهید. مثلا کاربری را با سطح خواندنی در نظر بگیرید و رشته اتصال خود را زمانی که قرار است تنها گزارش گیری از بانک اطلاعاتی داشته باشید ( و نمی خواهید هیچ اطلاعاتی اضافه، حذف یا ویرایش کنید ) با استفاده از این کاربر تعریف کنید. SQL Server نقش ها ( Roles ) های مختلفی را در اختیار شما قرار می دهد مثلا : db_owner یا db_datareader و ... .
هنگامی که دات نت فریم ورک را نصب می کنید یک یوزر جدید به ویندوز شما اضافه می شود. برای کار با پایگاه داده نیاز دارید که به این یوزر اجازه دسترسی به دیتابیس خود را بدهید. برای این کار مراحل زیر را دنبال کنید :
Enterprise Manager را باز کنید و به بخش Security بروید. روی قسمت Logins کلیک راست کنید و New Login را انتخاب کنید. پنجره جدیدی باز می شود. در برگه General این پنجره و از بخش Name با کلیک بر روی دکمه ای که در سمت راست هست ( برای browse کردن ) پنجره ای باز می شود که حاوی لیست تمام یوزرهای موجود روی سرور است. یوزر ASPNET را پیدا کنید و روی دکمه Add کلیک کنید. سپس Ok کنید. دوباره به پنجره New Login برمی گردید. در بخش Authentication گزینه Windows Authentication را انتخاب کنید. چیزهای دیگری که شاید مایل به تغییرشان باشید زبان و دیتابیس پیش فرض برای این یوزر است. به کمک برگه Server Roles می توانید نقش این یوزر در سرور را مشخص کنید. و در نهایت به کمک برگه Database Access دیتابیس هایی که می خواهید یوزر ASPNET به آن ها دسترسی داشته باشد را مشخص کنید ( به همراه نقش های مورد نظر ). با کلیک بر روی Ok یوزر ASPNET به مجموعه یوزرهای SQL Server و نیز دیتابیس هایی که مشخص کرده اید اضافه می شود. بعدا می توانید داخل هر دیتابیس از طریق بخش Users میزان دسترسی به جداول را نیز کنترل کنید. این تصویر هم پنجره های مورد نظر این کار را نشان می دهد.
نگاهی به نسخه جدید SQL Server 2005
عرضه شدن نسخه 2005 پایگاه دادهای مشهور مایکروسافت یعنی SQLServer، بازار نرمافزارهای بانک اطلاعاتی را به شدت تحت تأثیر خود قرار داد. امکانات گستردهای که در این نسخه جدید تعبیه شده، طراحی و پیادهسازی بانکهای اطلاعاتی را سرعت بخشیده و تلفیق و انطباق آن با انواع فناوریهای نو مانند XML وADO.NET، باعث افزایش قدرت و کارایی آن شده است. در این مقاله به برخی از ویژگیهای جدید این برنامه نگاهی خواهیم داشت.
Snapshot Isolation Level
یکی از روشهایی که به انواع متدهای قفل کردن ردیفهای یک جدول بانکاطلاعاتی در نسخه جدید اضافه شده است، شیوه تصویربرداری از رکورد است. در روشهای قبلی، اگر یک یا چند رکورد بانک اطلاعاتی توسط دستور BeginTrans که شروع یک فرآیند را مشخص میکند در شرف تغییر یا حذف قرار میگرفتند، تا مادامی که فرآیند مذکور توسط دستور Commit Trans تأیید یا توسط RollBack منتفی نشود، از هیچ جا و برنامهای نمیتوان رکوردهای مذکور را حتی با دستور ساده SELECT خواند. اما در روش جدید قفلگذاری، در صورت بروز چنین رویدادی سایر کاربران میتوانند همواره آخرین ارزش رکوردهای مذکور را با این فرض که هنوز هیچ تغییری در آنها ایجاد نشده است بخوانند و مورد استفاده قرار دهند.
باز هم داتنت
با نسخه جدید SQL Server، برنامهنویسان بانکهای اطلاعاتی قادرند از امکانات و قابلیتهای موجود در پلتفرم داتنت و کلیه توابع و کلاسهای ساخته شده در آن بهرهمند شوند. یکی از ابتداییترین و در عین حال اساسیترین این قابلیتها، امکان استفاده از دو زبان مهم و کاربرپسند داتنت یعنی ویژوال بیسیک و سیشارپ در پیادهسازی اجزای مختلف یک بانکاطلاعاتی است. این عامل نهتنها باعث میشود که برنامهنویسان برای نوشتن ماژولهایی مثل تریگرها، روالها (Stored Procedures) در توابع به جای استفاده از زبان استاندارد و در عین حال پیچیده T-SQL ، بتوانند از زبانهای محیط داتنت با تمام ساختارها، دستورات، کلاسها، آرایهها، و خلاصه تمام ویژگیهای یک زبان شی گرا استفاده کنند، بلکه این همکاری نزدیک بین موتور برنامهنویسی داتنت یعنی CLR (که مسؤول تبدیل کدهای نوشته شده داتنت به زبان سیستمعامل است) و موتور بانک اطلاعاتی SQLServer باعث شده تا به غیر از تنوع زبانهای برنامهنویسی قابل استفاده درSQLServer، تغییر قابل توجهی نیز در کارایی ماژولهای مذکور پیش آید. در واقع موضوع از این قرار است که اصولاً کدهای نوشته شده به زبانهای داتنت، ابتدا توسط کامپایلر به زبان (IL) ترجمه میشوند. سپس CLR این کد میانی را به کد قابل فهم سیستمعامل تبدیل و آماده اجرا مینماید. این کار سبب میشود تا کدهای نهایی به دلیل اینکه بسیار به سیستمعامل نزدیک میباشد سریعتر از کدهای TSQL (که فقط توسط موتور بانک اطلاعاتی قابل اجرا هستند) اجرا شوند و در زمان اجرا از کارایی بیشتری برخوردار باشند. البته این مسأله بدین معنی نیست که استفاده از زبانهای داتنت همیشه بر زبانهای SQL ارجحیت دارد، بلکه منظور آن است که در برخی موارد ممکن است آن قدر منطق و الگوریتم یک ماژول پیچیده باشد که برنامهنویس استفاده از زبانهای داتنت را به دلیل آسانتر بودن ساختار و دستورات آن به زبان SQL ترجیح دهد. بنابراین زمانی که بیشترعملیات یک ماژول مربوط به خواندن و نوشتن اطلاعات باشد بهتر است از همان دستورات استاندارد SQL یعنی SELECT ،UPDATE ،DELETE وINSERT استفاده کرده و بیجهت منابع سیستم را صرف تعریف متغیرها و کلاسهای داتنت ننماید. اما در ماژولهایی که بیشتر عملیاتشان شامل پردازش اطلاعات مثل انجام عملیاتهای ریاضی یا مقایسه اطلاعات با یکدیگر است بهتر است تا هم از امکانات برنامهنویسی و هم از سرعت و کارایی بالای داتنت در این زمینه بهره برد و ماژولهای مذکور را با زبانهای داتنت پیادهسازی کرد.
ADO .NET وارد میشود
طبق یک سنت نهچندان قدیمی برنامهنویسی در محیط ویندوز، برنامهنویسان SQLServer، بانک اطلاعاتی موردنظرشان را برروی سرور و برنامه کاربردی نوشته شده با زبانی مثل ویژوال بیسیک را بر روی کلاینتها قرار میدهند. سپس از طریق این برنامه کاربردی و با استفاده از اشیایی از جنس ADO دادههای موردنیاز خود را از سمت سرور دریافت کرده و یا به آن ارسال میکنند. اکنون این ارتباط به لطف نسخه جدید SQLServer و همچنین محیط داتنت، با امکانات جدیدADO.NET بسیار کاملتر از قبل شده است. این ارتباط جدید با استفاده از مکانیسمی به نام اعلان (Notification) به یک ارتباط دوطرفه فعال تبدیل شده به طوری که ADO.NET قادر است پیغامهایی را از سمت پایگاه داده به سمت کلاینت ارسال کند. به عنوان مثال فرض کنید که شما با استفاده ازADO تعدادی از رکوردهای یک جدول بانک اطلاعاتی را انتخاب کرده و مشغول کار برروی آنها هستید. در همین هنگام کاربر دیگری از طریق کلاینت و ADO خود، رکوردی در محدوده رکوردهای مورد انتخاب شما را تغییر میدهد یا حذف میکند. در این وقت موتور پایگاه داده با ارسال پیغامی به ADO شما، این مسأله را با استفاده از فراخوانی یک رخداد (Event) شی ADO به اطلاعتان میرساند.
علاوه براین قابلیت جدید، فناوری جدید دیگری هم با استفاده ازADO.NET به نسخه جدید SQLServer اضافه شده و آن امکان چند پرسوجوی همزمان توسط یک شی ADO است. در این شیوه اگر یک شی ADO با استفاده از دستور SELECT مشغول خواندن تعدادی از رکوردهای یک جدول بانک اطلاعاتی باشد، میتواند بدون اینکه منتظر به پایان رسیدن این عملیات شود، تعداد دیگری از رکوردهای یک جدول دیگر بانک اطلاعاتی را بخواند. این قابلیت جدید با نام (Multiple Active Result Set (MARS که قبلاً فقط در کرسرهای سمت سرور (server side) و آن هم نه با کارایی بالا وجود داشت اکنون در کرسرهای سمت راست کلاینت هم وجود دارد و تفاوت عمده آن با شکل قدیمی هم علاوه بر مورد مذکور، امکان ایجاد چند کرسر در یک شی ADO به صورت همزمان است. SQLServer نسخه 2005 به خوبی از تمام این ویژگیها، پشتیبانی میکند.
تکنولوژی XML
اکنون که XML به یک استاندارد ارتباطی بین سکوهای مختلف تبدیل شده است، نسخه جدید SQLServer هم از توجه کافی به آن و ایجاد یک انقلاب در سادهتر استفاده کردن از آن طفره نرفته است. در نسخه 2000 کاربران قادر بودند تا با استفاده از دستور FOR XML نتیجه یک پرسوجوی SELECT از یک بانک اطلاعاتی را به درون یک فایل XML بریزند یا مثلاً با دستور OPEN XML میتوانستند یک فایل XML را باز کرده و شروع به خواندن دستورات درون آن نمایند.
از آنجا که در نسخه جدید SQLServer توجه خاصی به این استاندارد و زبان ارتباطی شده است، یک نوع داده جدید (Data type) به انواع دادههای قبلی و استاندارد SQL مثل int ، char و امثال آن اضافه شده است. این نوع داده جدید که XML نام دارد و دارای خصوصیات یک نوع داده موجود در یک محیط شیگرا است، دارای متدهای پیشرفتهای چون ()nodes() ،Value() ،exist() ،query و ()modify بوده و قادر است انواع پردازشهای قابل انجام برروی اسناد XML را به راحتی انجام دهد. عملیات جستجو، تغییر، حذف و درج مقادیر موردنظر در داخل یک فایل XML را میتوان با استفاده از متدهای مذکور و صرفاً با چند خط برنامهنویسی انجام داد. همچنین در این نسخه برخلاف نسخه 2000، با استفاده از دستور FOR XML میتوان یک شیء از جنس XML را بدون ارسال آن به کلاینت، برروی سرور ساخته و از آن نگهداری کرد. با این کار میتوان جداولی را که مرتباً مورد رجوع کاربران قرار میگیرند هراز گاهی در قالب XML به داخل حافظه آورد و کاربران مذکور به جای رجوع به جداول اصلی در هارددیسک، با استفاده از دستورات ویژه جستجو درXML ، متغیر مذکور را در حافظه سرور مورد جستجو قرار دهند و بدینوسیله یک نوع عمل Cache کردن را جهت افزایش سرعت دسترسی به اطلاعات تکراری شبیهسازی کنند. در این حالت، کاربران به جای استفاده از دستورSELECT استاندارد میتوانند از OPEN XML که در نسخه 2005 قادر است متغیرهای جدید از نوع XML را بخواند استفاده کرده و به سرعت به اطلاعات موردنیاز خود دسترسی پیدا کنند. این قابلیت جدید آنقدر در سریعتر کردن جستجو در برنامههای تحت وب مهم و مؤثر است که جای هیچ مشکلی را در استفاده از آن باقی نمیگذارد.
سرویس اعلان (Notification)
همانطور که گفتیم سیستم اعلان درSQLServer قادر است پیغامهایی را طی زمانهای مشخص به سمت کاربران بفرستد. مثلاً تصور کنید که تعدادی کاربر در حال اتصال به یک بانک حاوی اطلاعات مربوط به ارزش سهام در بورس هستند. از آنجایی که ممکن است قیمت سهام هر شرکت یا مؤسسه برای تعدادی از کاربران از اهمیت زیادی برخوردار باشد، میتوان این سیستم را طوری تنظیم کرد تا هرگاه ارزش سهام خاصی که موردنظر هر کاربر است تغییر کرد، به صورت اتوماتیک به وی اعلام شود. کاربر هم میتواند این تغییرات را برروی برنامه کاربردی خود، تلفن همراه (در قالب Windows Messenger ،(SMS و یا ایمیل بهصورت مرتب دریافت و مشاهده کند.
سرویس گزارشگیری
سرویس جدید تولید گزارشهای متنوع در نسخه 2005 به یکی از جالبترین و پرکاربردترین قابلیتهای این نسخه تبدیل شده است، وجود یک موتور گزارشگر قوی در سمت سرور و یک ابزار مناسب ساخت گزارش با واسط کاربر عالی، باعث شده تا برنامهنویسان بتوانند گزارشهای موردنظر خود را با کارایی و سرعت مناسب در سمت سرور بسازند به طوری که این گزارشهای سمت سرور توسط هر برنامه کاربردی سمت کلاینت در هر پلتفرمی با همان امکانات اتصال به SQLServer قابل مشاهده است.
بهبودهای ایجاد شده در زبان
در 2005 SQLServer تغییرات بسیار مثبتی در زبان SQL T ایجاد شده است. این تغییرات در زمینههای مختلف مثل مدیریت خطاها، جستجوهای بازگشتی (Recursive Query) و حتی در بدنه موتور پایگاه دادهها انجام شده و کارایی کلی ذخیره و یا خواندن اطلاعات را به نحو مطلوبی افزایش داده است. به عنوان مثال دردستورات
TSQL، دو اپراتور جدید دیده میشود، که PIVOT وUNPIVOT نام دارند. این دو اپراتور که در قسمت FROM یک پرسوجو مورد استفاده قرار میگیرند میتوانند نتیجه یک جستجوی انجام شده توسط دستور SELECT را به جای برگرداندن در قالب ردیفها یا رکوردهای پشتسرهم، به صورت ستونهای مختلف یک یا چند رکورد برگردانند. در این روش یکی از ستونهای (فیلدهای) یک جستجو به عنوان محور معرفی شده و بقیه ستونها براساس آن به صورت افقی طبقهبندی میشوند. به یک مثال توجه کنید:
SELECT CUSTOMER ID, order No
FROM orders PIVOT CustomerID
Order No Order No Order No Order No Customer ID
4400 1120 25 1
350 2
1780 443 3
8989 2222 1980 555 4
نتیجه جستجوی فوق چیزی شبیه جدول بالا خواهد بود
همانطور که مشاهده میکنید با استفاده از اپراتور مذکور، نتیجه پرسوجوی انجام شده به این صورت که هر ردیف به یک شماره مشتری و چندین شماره سفارش مربوطه به آن مشتری در قالب ستونهای مختلف است، در میآید. این همان چیزی است که سالها درSQLServer وجود نداشت و ابزارهای مختلف گزارشسازی مثل CrystalReport آن را با نام Cross Tab به کاربران خود ارایه میدادند. در همین رابطه اپراتورUNPIVOT هم عمل عکس اپراتور مذکور را انجام میدهد.
اپراتور دیگری که میتواند نقش مهمی را در دستورات SQL بازی کند APPLY نام دارد که در قسمت FROM یک دستور SQL به کار میرود. با استفاده از این دستور میتوان خروجی یک تابع (Function) را با یک یا چند جدول دیگر ترکیب (Join) کرد همانطور که میدانید در 2005 SQLServer توابع میتوانند یک یا چند ردیف یک جدول اطلاعاتی را برگردانند که این خروجی میتواند با یک جدول دیگر با استفاده از اپراتور مذکور ترکیب شود.
مدیریت خطا
در نسخههای قدیمی SQLServer برای کشف و مدیریت خطا از سیستم Error Handling استفاده میشد. این شیوه کشف خطا که در زبانی مثل ویژوال بیسیک 6 هم مورد استفاده قرار میگرفت با استفاده از دستور GOTO میتوانست کنترل و خط اجرای روال را از یک محل به محل دیگر و در واقع از محل بروز خطا به محل مدیریت و آشکار کردن (Raise) آن ببرد و بدینوسیله پیغام خطایی را به کار نشان دهد. نسخه جدید SQLServer با تأثیر از پلتفرم داتنت، از دستورات ویژه کشف و مدیریت خطا با عنوان Exception Handling استفاده میکند. این روش با استفاده از دستورات جدید TRY/CATCH شیوه بهتری از مدیریت خطا را به اجرا میگذارد. در این روش برخلاف روش قبل، تمام خطاهای اتفاقافتادنی مثل خطاهای مربوط به تبدیل دادهها به یکدیگر (DataConversion) به خوبی مدیریت شده و از بروز خطاهایی که منجر به اتمام ناقص عملیات یک روال یا تریگر میشود جلوگیری به عمل میآید.