تا اینجا، فقط با یک TableAdapter برای یک جدول از پایگاه داده کار کردهایم. در حالی که پایگاه داده Northwind دارای جدوال و ارتباط های بیشتری میباشد که در این برنامه تحت وب از آنها استفاده خواهیم کرد. یک TypedDataSet میتواند شامل چندین DataTable باشد. بنابراین برای تکمیل DAL نیاز است که برای هر جدول یک DataTable اضافه کنیم. برای اضافه کردن یک TableAdapter جدید به DataSet، در محیط طراحی DataSet کلیک راست کرده و Add/TableAdapter را انتخاب کنید. TableAdaperهای زیر را به DataSet اضافه کنید:
· ProductsTableAdapter
o GetProducts:
SELECT ProductID, ProductName, SupplierID, CategoryID,
QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder,
ReorderLevel, Discontinued , (SELECT CategoryName FROM
Categories WHERE Categories.CategoryID =
Products.CategoryID) as CategoryName, (SELECT CompanyName
FROM Suppliers WHERE Suppliers.SupplierID =
Products.SupplierID) as SupplierName
FROM Products
o GetProductsByCategoryID:
SELECT ProductID, ProductName, SupplierID, CategoryID,
QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder,
ReorderLevel, Discontinued , (SELECT CategoryName FROM
Categories WHERE Categories.CategoryID =
Products.CategoryID) as CategoryName,
(SELECT CompanyName FROM Suppliers WHERE
Suppliers.SupplierID = Products.SupplierID) as SupplierName
FROM Products
WHERE CategoryID = @CategoryID
o GetProductsBySupplierID
SELECT ProductID, ProductName, SupplierID, CategoryID,
QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder,
ReorderLevel, Discontinued ,
(SELECT CategoryName FROM Categories WHERE
Categories.CategoryID = Products.CategoryID)
as CategoryName, (SELECT CompanyName FROM Suppliers
WHERE Suppliers.SupplierID = Products.SupplierID)
as SupplierName
FROM Products
WHERE SupplierID = @SupplierID
o GetProductByProductID
SELECT ProductID, ProductName, SupplierID, CategoryID,
QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder,
ReorderLevel, Discontinued , (SELECT CategoryName
FROM Categories WHERE Categories.CategoryID =
Products.CategoryID) as CategoryName,
(SELECT CompanyName FROM Suppliers
WHERE Suppliers.SupplierID = Products.SupplierID)
as SupplierName
FROM Products
WHERE ProductID = @ProductID
· CategoriesTableAdapter
o GetCategories
SELECT CategoryID, CategoryName, Description
FROM Categories
o GetCategoryByCategoryID
SELECT CategoryID, CategoryName, Description
FROM Categories
WHERE CategoryID = @CategoryID
· SuppliersTableAdapter
o GetSuppliers
SELECT SupplierID, CompanyName, Address, City,
Country, Phone
FROM Suppliers
o GetSuppliersByCountry
SELECT SupplierID, CompanyName, Address,
City, Country, Phone
FROM Suppliers
WHERE Country = @Country
o GetSupplierBySupplierID
SELECT SupplierID, CompanyName, Address,
City, Country, Phone
FROM Suppliers
WHERE SupplierID = @SupplierID
· EmployeesTableAdapter
o GetEmployees
SELECT EmployeeID, LastName, FirstName,
Title, HireDate, ReportsTo, Country
FROM Employees
o GetEmployeesByManager
SELECT EmployeeID, LastName, FirstName,
Title, HireDate, ReportsTo, Country
FROM Employees
WHERE ReportsTo = @ManagerID
o GetEmployeeByEmployeeID
SELECT EmployeeID, LastName, FirstName,
Title, HireDate, ReportsTo, Country
FROM Employees
WHERE EmployeeID = @EmployeeID
نکته قابل توجه اینکه، کلاس ProductsTableAdapters مقادیر CategoryID و SupplierID را از جدول Products برمیگرداند، اما شامل فیلد CategoryName از جدول Category و فیلد CompanyName از جدول Supplier نمیشود، در حالی که ما میخواهیم هنگام نمایش اطلاعات محصولات، این دو فیلد هم نمایش داده شوند. میتوانیم متد GetProducts() را طوری تغییر دهیم که CategoryName و CompanyName را نمایش دهیم.
اگر این متد با JOIN نوشته شود، دستورات Insert, Update, Delete به طور خودکار تولید نمیشوند که بتوان از آنها استفاده کرد. به همین دلیل، برای برآورده شدن نظر بالا از دستور زیر استفاده میکنیم:
SELECT ProductID, ProductName, SupplierID, CategoryID,
QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, ReorderLevel, Discontinued,
(SELECT CategoryName FROM Categories
WHERE Categories.CategoryID = Products.CategoryID) as CategoryName,
(SELECT CompanyName FROM Suppliers
WHERE Suppliers.SupplierID = Products.SupplierID) as SupplierName
FROM Products
متدهای Insert(), Update(), Delete() ایجاد شده توسط روش تاثیر مستقیم روی پایگاه داده، به ویژه برای جدولهایی با ستونهای زیاد، میتواند دست و پا گیر باشد.
برای ایجاد متدهای سفارشی به محیط طراحی DataSet بروید. روی TableAdapter راست کلیک کرده و Add Query را انتخاب کنید، در پنجره دوم میتوانیم مشخص کنیم که چه نوع کوئری میخواهیم ایجاد کنیم. اجازه دهید یک متد که یک محصول جدید اضافه کرده و ProductID آن را برگرداند، ایجاد کنیم. بنابراین گزینه INSRT را انتخاب میکنیم.
در مرحله بعدی CommandText مربوط به InsertCommand دیده میشود. به پایان این کوئری عبارت SELECT SCOPE_IDENTITY() را اضافه کنید، این عبارت مقدار ستون IDENTITY آخرین رکورد درج شده را برمیگرداند. مطمئن شوید که در پایان دستور INSERT و قبل از اضافه کردن عبارت، از نقطه ویرگول (;) استفاده کردهاید.
در پایان متد جدید را InsertProduct بنامید.
وقتی به محیط طراحی DataSet برمیگردید، میبینید که یک متد به نام InsertProduct به ProductsTableAdapter اضافه شده است. اگر متد جدید دارای پارامتر نباشد، ممکن است نقطه ویرگول پایان دستور INSERT را فراموش کرده باشید. متد InsertProduct را پیکربندی (Configure) کرده و نقطه ویرگول را اضافه نمایید. به طور پیش فرض، متدهای Insert به صورت None Query ایجاد میشوند، بدین معنی که تعداد سطرهایی که درج شدهاند را برمیگردانند. ولی ما میخواهیم این متد مقداری که کوئری برمیگرداند را برگرداند نه تعداد سطرها را. برای این منظور مشخصه ExecuteMode متد InsertProduct را به Scalar تغییر دهید.