دو روش عمومی برای درج کردن، بروزرسانی و حذف داده وجود دارد. روش اول، شامل ایجاد متدهایی است که وقتی فراخوانی میشوند یک دستور Insert, Update و یا Delete ایجاد میکنند که بر روی یک رکورد از پایگاه داده اثر میگذارد.
روش دیگر؛ بروزرسانی یک DataSet, DataTable و یا مجموعهای از DataRows است که در یکبار فراخوانی متد انجام میشود. در این روش، توسعه دهنده DataRows را در یک DataTable درج میکند، بروزمیرساند و یا تغییر میدهد و سپس آنها را به یک متد بروزرسانی ارسال میکند. سپس این متد DataRows که در دریافت کرده را بررسی و تعیین میکند که کدام یک اضافه شده است، تغییر کرده است و یا حذف شده است و پس از آن برای هر رکورد یک دستور مناسب پایگاه داده صادر میکند.
TableAdapter به طور پیش فرض از روش بروزرسانی بستهای (روش دوم) استفاده میکند، اما از روش تاثیر مستقیم روی پایگاه داده (روش اول) نیز پشتیبانی میکند. زمانی که گزینه "Generate Insert, Update, and Delete statements" را از Advanced Properties هنگام ایجاد TableAdapter انتخاب میکنیم، ProductsTableAdapter دارای یک متد Update() میشود که روش بروزرسانی بستهای را ایجاد میکند. هر دو روش تغییر داده از مشخصههای InsertCommand, UpdateCommand, DeleteCommand مربوط به TableAdapter برای صدور دستورات insert, update, delete به پایگاه داده استفاده میکنند. شما میتوانید مشخصههای InsertCommand, UpdateCommand, DeleteCommand را با کلیک کردن روی TableAdapter در محیط طراحی DataSet و مراجعه به پنجره Properties آن، بررسی کنید و تغییر دهید.
برای امتحان کردن و یا تغییر دادن هر کدام از مشخصههای دستورات پایگاه داده، روی زیرمشخصه CommandText کلیک کرده و Query Builder را اجرا کنید.
کدهای نمونه زیر نشان میدهد که چگونه روش بروزرسانی بستهای را برای دو برابر کردن قیمت محصولاتی که تولید آنها متوقف نشده و 25 عدد و یا کمتر از آن موجود است:
NorthwindTableAdapters.ProductsTableAdapter productsAdapter =
new NorthwindTableAdapters.ProductsTableAdapter();
// For each product, double its price if it is not discontinued and
// there are 25 items in stock or less
Northwind.ProductsDataTable products = productsAdapter.GetProducts();
foreach (Northwind.ProductsRow product in products)
if (!product.Discontinued && product.UnitsInStock <= 25)
product.UnitPrice *= 2;
// Update the products
productsAdapter.Update(products);
کدهای زیر نشان میدهند که چگونه از روش مستقیم روی پایگاه داده برای حذف یک محصول خاص، سپس بروزرسانی دیگری و اضافه کردن یک محصول جدید استفاده کنیم:
NorthwindTableAdapters.ProductsTableAdapter productsAdapter =
new NorthwindTableAdapters.ProductsTableAdapter();
// Delete the product with ProductID 3
productsAdapter.Delete(3);
// Update Chai (ProductID of 1), setting the UnitsOnOrder to 15
productsAdapter.Update("Chai", 1, 1, "10 boxes x 20 bags",
18.0m, 39, 15, 10, false, 1);
// Add a new product
productsAdapter.Insert("New Product", 1, 1,
"12 tins per carton", 14.95m, 15, 0, 10, false);
در این زمان کلاس ProductsTableAdapter دارای یک متد است، GetProducts()، که تمام محصولات موجود در پایگاه داده را برمیگرداند. تا زمانی که بخواهیم با تمام محصولات کار کنیم این متد مناسب است، اما گاهی مواقع نیاز است که اطلاعات مربوط به یک محصول خاص را بازیابی کنیم، و یا تمام محصولاتی که در یک گروه قرار دارند را میخواهیم. برای اضافه کردن چنین توابعی به لایه دسترسی داده، میتوانیم متدهای دارای پارامتر به TableAdapter اضافه کنیم.
بدین منظور متد GetProductsByCategoryID(categoryID) را اضافه میکنیم. برای اضافه کردن متد جدید به DAL به محیط طراحی DataSet رفته و با کلیک راست در ProductsTableAdapter گزینه Add Query را انتخاب میکنیم.
در قدم اول باید مشخص کنیم که یک دستور SQL ایجاد میکنیم و یا از یک رویه ذخیره شده استفاده میکنیم. با انتخاب ایجاد یک دستور SQL؛ ad-hoc SQL statement؛ به مرحله بعد میرویم. در این مرحله پرسش میشود که چه نوع پرس و جوی SQL میخواهیم استفاده کنیم. از آنجایی که میخواهیم کلیه محصولاتی که در یک گروه قرار دارند را برگردانیم، از گزینه select که چندین سطر برمیگرداند، استفاده میکنیم.
قدم بعدی تعیین SQL Query برای دسترسی به دادهها است. از آنجایی که ما میخواهیم تمام محصولات مربوط به یک گروه خاص را برگردانیم، از دستوری مشابه GetProducts() استفاده میکنیم، اما شرط زیر را به آن اضافه میکنیم: where categoryID=@categpryID.
در مرحله آخر میتوانیم الگوی مورد استفاده برای دسترسی به داده را مشخص کنیم، مانند تعیین نام متدی که ایجاد شده است. نام الگوی Fill را به FillByCategoryID و الگوی برگرداندن DataTable را به GetProductsByCategoryID تغییر میدهیم.
بعد از پایان مراحل، محیط طراحی DataSet شامل یک متد جدید برای TableAdapter است.
متدهای دارای پارامتر را میتوان در محیط طراحی DataSet تست کرد. در TableAdapter بر روی متد راست کلیک کرده و Preview Data را انتخاب کنید. سپس مقدار پارامتر را وارد کرده و کلید Preview را کلیک کنید.
به وسیله GetProductsByCategoryID (categoryID) در DAL میتوانیم در یک صفحه ASP.NET محصولاتی که در یک گروه هستند را نمایش دهیم. نمونه کد زیر تمام محصولات گروه Beverages که دارای categoryID برابر 1 هستند را نشان میدهد:
Beverages.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Beverages.aspx.cs"
Inherits="Beverages" %>
<!DOCTYPE html PUBLIC "//
W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1transitional.
dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
<link href="Styles.css" rel="stylesheet" type="text/css" />
</head>
<body>
<form id="form1" runat="server">
<div>
<h1>Beverages</h1>
<p>
<asp:GridView ID="GridView1" runat="server"
CssClass="DataWebControlStyle">
<HeaderStyle CssClass="HeaderStyle" />
<AlternatingRowStyle CssClass="AlternatingRowStyle" />
</asp:GridView>
</p>
</div>
</form>
</body>
</html>
Beverages.aspx.cs
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using NorthwindTableAdapters;
public partial class Beverages : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
ProductsTableAdapter productsAdapter = new
ProductsTableAdapter();
GridView1.DataSource =
productsAdapter.GetProductsByCategoryID(1);
GridView1.DataBind();
}
}
رای ایجاد DAL یک TypedDataSet به پروژه اضافه میکنیم. برای انجام این کار روی نام پروژه کلیک راست کرده و Add New Item را انتخاب کنید. از لیست قالبها DataSet را انتخاب کرده و آن را Northwind.xsd بنامید.
هنگام کلیک دکمه Add کادر محاورهای باز میشود با این پیام که میخواهد DataSet را درون پوشه App_Data قرار دهد. با زدن دکمه Yes آن را تایید کنید. پس از آن، صفحه طراحی DataSet نمایش داده شده و مراحل پیکربندی TableAdapter شروع میشود. این مراحل به شما کمک میکند که اولین TableAdapter را به Typed DataSet اضافه کنید. در این آموزش برای هر کدام از جدولهای پایگاه داده یک strongly-typed DataTable ایجاد میکنیم.
در نظر داشته باشید که strongly-typed DataTable شامل هیچگونه اطلاعاتی که نشان دهنده چگونگی دسترسی به جدول مورد نظر در پایگاه داده باشند، نیستند. برای بازیابی اطلاعات جهت DataTable از کلاس TableAdapter استفاده میکنیم. برای Products DataTable، متدهای GetProducts() و GetProductByCategoryID(categoryID) درون TableAdapter قرار دارند که توسط لایه نمایش فراخوانی میشوند. مراحل پیکربندی TableAdapter با تلاش برای مشخص کردن پایگاه داده شروع میشود. از لیست آبشاری میتوانید پایگاههایی که در Server Explorer هستند را مشاهده و انتخاب کنید. اگر Northwind به Server Explorer اضافه نشده است، میتوانید با کلیک روی New Connection یک اتصال جدید برقرار کنید.
پس از انتخاب پایگاه داده و رفتن به مرحله بعدی از شما در مورد ذخیره Connection String در فایل Web.config پرسیده میشود.
پس از آن باید طرحی را برای strongly-typed DataTable مشخص کنیم و اولین متد را برای TableAdapter جهت استفاده در DataSet تهیه نماییم. این دو مرحله به طور همزمان با ایجاد یک کوئری که فیلدهای جدولی که میخواهیم در DataTable انعکاس پیدا کند را برمیگرداند، انجام میشود. در پایان مراحل یک نام برای کوئری انتخاب میکنیم. پس از پایان مراحل، میتوان این متد را در لایه نمایش فراخوانی کرد. در مرحله بعدی نوع دسترسی TableAdapter به پایگاه داده را باید مشخص کنیم.
در این مرحله میتوانیم کوئری SQL را بنویسیم. کدهای مشخص شده زیر تمام اطلاعات جدول Products را برمیگرداند.
به جای آن میتوان از Query Builder استفاده کرد.
پس از ایجاد کوئری، قبل از رفتن به مرحله بعد، بر روی Advanced Options کلیک کنید. در پروژههای وب سایت، گزینه Generate Insert, Update, and Delete statements به طور پیش فرض انتخاب شده است؛ در پروژههای ویندوزی گزینه Use optimistic concurrency نیز انتخاب شده است که اگر چنین است، آن را از انتخاب درآورید.
پس از آن به مرحله آخر رفته و در مورد چگونگی اضافه کردن متد به TableAdapter پرسیده میشود:
· Fill a DataTable: با این گزینه یک متد ایجاد میشود که در یک DataTable به عنوان یک پارامتر نگهداری میشود.
· Return a DataTable: با این گزینه متد ایجاد میشود و DataTable به عنوان متد برگردانده میشود.
میتوان در یک TableAdapter هر دو گزینه را انتخاب کرد. همچنین میتوان نام متدها را تغییر داد. در حال حاضر هر دو گزینه را انتخاب کرده و نام GetData را به GetProducts تغییر دهید.
اگر گزینه آخر؛ GenerateDBDirectMethods؛ را انتخاب کنید متدهای Insert(), Update() و Delete() برای TableAdapter ایجاد میشوند. اگر این گزینه انتخاب نشود تمام بروزرسانیها باید تنها از طریق متد Update() مربوط به TableAdapter که در Typed DataSet قرار دارد انجام شود (اگر در مراحل قبلی گزینه Generate Insert, Update, and Delete statements را انتخاب نکرده باشید، این گزینه غیر فعال است). این گزینه را انتخاب کنید.
مراحل را با کلید دکمه Finish به پایان برسانید. بعد از بسته شدن مراحل پیکربندی به صفحه طراحی DataSet برمیگردیم که در آن DataTable که ایجاد کردیم وجود دارد. شما میتوانید تمام فیلدها را در Products DataTable مشاهده کنید و همچنین متدهای ProductsTableAdapter(fill() and GetProducts()) نیز قابل مشاهده هستند.
در حال حاضر یک Typed DataSet به همراه یک DataTable (Northwind.Products) و یک کلاس strongly-typed DataAdapter (NorthwindTableAdapters.ProductsTableAdapter) همراه با متد GetProducts() داریم.
این متدها میتوانند مانند کدهای زیر برای دسترسی به لیست تمام محصولات استفاده شوند:
NorthwindTableAdapters.ProductsTableAdapter productsAdapter =
new NorthwindTableAdapters.ProductsTableAdapter();
Northwind.ProductsDataTable products;
products = productsAdapter.GetProducts();
foreach (Northwind.ProductsRow productRow in products)
Response.Write("Product: " + productRow.ProductName + "<br />");
همانگونه که میبینید نیازی برای نوشتن حتی یک کد برای دسترسی به پایگاه داده نیست. نیازی برای استفاده از کلاس های ADO.NET نیست، نیازی به ارجاع به هیچ رشته اتصالی نیست. در عوض TableAdapter کدهای سطح پایین برای دسترسی به داده را برای ما ایجاد میکند.
کدهای زیر نشان میدهند که چگونه DataTable توسط متد GetProducts() پر و در یک GridView نمایش داده میشود:
AllProducts.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="AllProducts.aspx.cs"
Inherits="AllProducts" %>
<!DOCTYPE html PUBLIC "//
W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1transitional.
dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>View All Products in a GridView</title>
<link href="Styles.css" rel="stylesheet" type="text/css" />
</head>
<body>
<form id="form1" runat="server">
<div>
<h1>
All Products</h1>
<p>
<asp:GridView ID="GridView1" runat="server"
CssClass="DataWebControlStyle">
<HeaderStyle CssClass="HeaderStyle" />
<AlternatingRowStyle CssClass="AlternatingRowStyle" />
</asp:GridView>
</p>
</div>
</form>
</body>
</html>
AllProducts.aspx.cs
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using NorthwindTableAdapters;
public partial class AllProducts : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
ProductsTableAdapter productsAdapter = new
ProductsTableAdapter();
GridView1.DataSource = productsAdapter.GetProducts();
GridView1.DataBind();
}
}