Bài 7: Cập nhật dữ liệu dùng Stored Procedure
13. Bước 3: Thêm một Order bằng cách dùng SPROC
Chúng ta sẽ bắt đầu chuyển mô hình dữ liệu sang dùng SPROC, bắt đầu từ đối tượng Object.
Đầu tiên, chúng ta đến cửa sổ "Server Explorer" mở rộng nhánh Stored Procedures trong CSDL của chúng ta, và sau đó nhấn phái chuột và chọn "Add New Stored Procedure":
Server Explorer a x
a % %
B 0 3 Data Connections
S - scottguvista4.Northwind.dbo g]- __1 Database Diagrams
É Tables
+ Eh
□ Views
□ I B I S "
+ J CustOrde Add New Stored Procedure
_ i —
J CustOrde j Refre, h T J C u st0.d e ^
Œ) UH Em ployeô ' K
I f t p t í ” n c t n m n p t x i k
s
JS:
GetCustomDetails
) D GetCustomerCompanyName C l GetCustomerDetails
n GetCustomerNamed J GetProductsAndCustomers
□ GetProductsByCategory GetProductsByCateqcryNarne
^ S o lu tio n Explorer '^Server Explorer
Sau dú ta tao them mửt thỹ tue cú tờn "InsertOrder" cú nhiờm vu chốn thờm mot bàn ghi m ai vào bâng Orders:
dbo.lnsertPioduct...vista4.Northwind) dboJnsertO rden _rót*4.Northw¡nd)* Default.aspx.ci NorthwmdDataContext.es c re a te pro cedure d b o .In se rtO rd e r
C © orderid in t o u tp u t, 4 .
©CustomerlD n c h a r (5 ),
©EmployeelD i n t ,
©orderoate d atetim e,
©RequiredDate d atetim e,
©ShippedDate d atetim e,
© sh ip via i n t ,
© Freight money,
©ShipName n v a rc h a r( 4 0 ) ,
©ShipAddress n v a rc h a r( 6 0 ) ,
© S h ip city n v a rc h a r( 1 5 ) ,
©shipRegion n v a rc h a r(1 5 ) ,
© shippostalcode n v a rc h a r(10) ,
© Shipcountry n v a rc h a r(1 5 )
)
in s e r t in t o LdDoj. LO rdersj (.LC u stom eriD j, LEmp lo yeeiD j , LOrderDatej , LR e q u ire d D a te j, [sh ip p e d D a te ], [ s h ip v i a ] , [ F r e ig h t ] , [shipName], [s h ip A d d re s s ], [ s h i p c i t y ] , [s h ip R e g io n ], [S h ip p o s ta lc o d e ], [S h ip c o u n try ])
v a l u e s (©customeriD, ©EmployeelD, ©orderDate, ©RequiredDate, ©ShippedDate,
^ sh ip v ia , © Freig h t, ©ShipName, © shipAddress, © s h ip c ity , ©ShipRegion,
^Shippostalcode, ©Shipcountry)]
set ©orderiD - c ast(s c o p e_i d e n t i t y() a g i n t)
Hay chu ÿ each SPROC dinh nghla tham sô OrderlD nhu mot tham sô dang OUTPUT. Dó là vi côt OrderID trong CSDL là cụt tu tàng mụi khi thờm mot bàn ghi múd vào. N guài goi sở truyờn già tri NULL khi goi nụ - và thỹ tucjnafy sở trà vờ già tri cỹa OrderlD m ai duỗc tao ra (bang càch goi hàm
ertOrder. ...vistai.Northwind)*
operties Categor/D
^3* CategotyNa me 'is* Description á * Picture
operties
■J* OrderiD ấ ProductlD
UnitPrice
^3* Quantity
‘4* Discount
♦ InsertOrder (ref System Jnt32
“i j
% 'ợ
E - ( jĩ Data Connections >
1 Jy scottguvista4.Northwind
♦. __J Database Diagrams
¿) ^3 Tables
® _ j Views
-1_J Stored Procédures
’ợTI CustOrderHist T1 CustOrdersDetail
"T1 CüstOrdersOrders D Employée Sales b) J TU GetCustomDetaili
~J GetCustomerCorr
~T1 GetCustomerDeta 7~1 GetCustomerNanr GetProductsAndC r i GetProductsByCa
n SalesByCategory 2 T e n M o s t Expensi T~n UpdateCustom erợ 71 VariableShapeSan - j SI- ^ 1 VariablebhapeSan
4 3 *
û^j Solution Explorer I ỉậ | Server Explorer
Bước cuối cùng là cấu hình lại để lớp truy cập dữ liệu dùng thủ tục SPROC khi chèn các đối tượng Order mới vào trong CSDL. Chúng ta có thế là điều này bằng cách chọn lớp Order trong cửa sooe LENQ to SQL designer, và sau đó chuyển đến bảng thuộc tính và nhấn nút 3 chấm (...) ở mục Insert để chọn thao tác tương ứng:
s Properties 'ĩ ẩ * OrderID
2 ? CustomerlD EmployeelD OrderDate 's ỹ Required Date
^3* ShỉppedDate á * ShipVia
Freight 23* ShipName [ã* ShipAddress
ShipCity ũẫ* ShipRegion
ShipPostalCode ShipCountry
c
c
_Êớ°EiEèèIL- ọ X
O rder Data Class
T~ ).\---
B Code G eneration
Access Public
Inheritance Moc (None)
Name O rder
□ D ata
Source dbo.O rders E .. ẻ. Methods
Delete Use Runtime
1 3 Use Runtime
Update Use Runtime
0
Khi nhấn nút này, cửa số sau sẽ hiện ra để có thể tùy biến hành vi Insert:
Configure 8ehavior I a fTằ"4—1
Select a class and behavior. Then, choose to either let th e system automatically generate code at runtime customize ônth specific insert, update, or delete methods.
Class:
or
Ofdef •
Behavior Insert
w \
f o Use runtime \
Let the system automatically generate insert, update, and delete logic at runtime.
Customize
\ -
Method Arguments Class Properties
OK ] Cancel
Ớ trên, nếu bạn chọn chế độ mặc nhiên ("Use Runtime") thì LINQ to SQL sẽ tính toán và sinh ra câu lệnh SQL động để thực hiện các thao tác tương ứng. Chúng ta có thể thay đối bằng cách nhấn chuột vào Customize và chọn thủ tục InsertOrder từ danh sách các SPROC:
Configure Behavior 1
Select a class and behavior. Then, choose to either let the system automatically generate code at runtime or c u s to m iz e w it h s p e c ific insert, u p d a te , o r d e le te m e t h o d s .
Use runtime
Let the system automatically generate insert, update, and delete logic it runtime.
$InsertOrder (ref System Jnt32 orderiO, System.Stnng customers). System .In t32 employeelD. System.DateTime
0
Method Arguments customer®
employeelO fretght orderOate ordertD requiredOate fhipAddresc shipCity shipCountry
Class Properties CustomerlD EmployeeiD Freight
¡OidpID (None) CustomeriD EmpJoyeelD Freight OrderOate RequiredDate ShipAddress
V ShipCity
Jttaüüi
LINQ to SQL sẽ hiến thị các tham số của thủ tục mà ta đã chọn, và cho phép ánh xạ các thuộc tính
Nhấn vào nút Ok là xong. Giờ đây bất cứ khi nào một đối tượng Order được thêm vào DataContext và phương thức SubmitChangesO được gọi, thủ tục InsertOrder sẽ được thực thi thay cho câu lệnh SQL động.
Quan trọng: Mặc dù hiện tại chúng ta đã dùng SPROC đế cập nhật, phương thức "OnValidate" của Order mà chúng ta đã tạo trước đây (trong bước 1 của bài viết này) để kiêm tra tính họp lệ của đối tượng Order sẽ vẫn được thực thi trước khi bất kỳ thay đổi nào được thực hiện. Do vậy chúng ta sẽ có một cách rõ ràng để xử lý và kiếm tra các quy tắc, và có thế dùng lại một cách dỗ dàng mà không phụ thuộc vào việc chúng ta dùng SQL động hay dùng SPROC.