آموزش ASP.NET

آموزش ASP.NET متفاوت از آنچه جاهای دیگر می بینید!

آموزش ASP.NET

آموزش ASP.NET متفاوت از آنچه جاهای دیگر می بینید!

اضافه کردن TableAdapterهای دیگر

تا اینجا، فقط با یک 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 تغییر دهید.