Các hàm trong C
Trang 1//chúng ta đang xây d ng mô hinh ba lop trong co so du li uự ệ
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Data.OleDb;
using System.Text;
using DTO;
namespace DAO
{
public class BookDao
{
// Hàm l y danh sách Bookấ
public IList GetBookList() {
// Kh i t o đ i tở ạ ố ượng k t n iế ố
OleDbConnection oledbCon = DataProvider.ConnectionData();
// Kh i t o và gán giá tr cho chu i truy v n c s d li uở ạ ị ỗ ấ ơ ở ữ ệ
string strSQL = "Select * From Book";
// Kh i t o đ i tở ạ ố ượng OleDBCommand th c thi câu truy v nự ấ
OleDbCommand oledbCmd = new OleDbCommand(strSQL, oledbCon);
// Kh i t o đ i tở ạ ố ượng OleDBDataReader
OleDbDataReader oledbDtr = oledbCmd.ExecuteReader();
// Kh i t o đ i tở ạ ố ượng ArrayList
ArrayList Arl = new ArrayList();
// Kh i t o đ i tở ạ ố ượng BookDto
BookDto BokDto = null;
// Trong khi OleDBDataReader còn có th đ cể ọ
while(oledbDtr.Read()) {
// Kh i t o l i đ i tở ạ ạ ố ượng BookDto
BokDto = new BookDto();
Trang 2// Gán giá tr cho các trị ường c a BookDtoủ
// Gán giá tr cho BookIDị
BokDto.ID = (string)oledbDtr["BookID"]; // Gán giá tr cho BookNameị
BokDto.Name = (string)oledbDtr["BookName"];
// Gán giá tr cho BookDateOfPuslishị
BokDto.DateOfPuslish = (string)oledbDtr["BookDateOfPuslish"];
// Gán giá tr cho BookPriceị
BokDto.Price = (string)oledbDtr["BookPrice"];
// Gán giá tr cho BookStatusị
BokDto.Status = (string)oledbDtr["BookStatus"];
// Gán giá tr cho BookAmountị
BokDto.Amount = (string)oledbDtr["BookAmount"];
// Gán giá tr cho BookRemainị
BokDto.Remain = (string)oledbDtr["BookRemain"];
// Gán giá tr cho BookDecriptionị
BokDto.Decription = (string)oledbDtr["BookDecription"];
// Gán giá tr cho BookAuthorIDị
BokDto.AuthorID = (string)oledbDtr["BookAuthorID"];
// Gán giá tr cho BookCategoryIDị
BokDto.CategoryID = (string)oledbDtr["BookCategoryID"];
// Thêm đ i tố ượng BookDto v a t o vào ArrayListừ ạ
Arl.Add(BokDto);
}
// Đóng k t n i OleDBConnectionế ố
oledbCon.Close();
// Đóng k t n i OleDBDataReaderế ố
oledbDtr.Close();
Trang 3// Tr v đ i tả ề ố ượng ArrayList
return Arl;
}
// Hàm l y m t đ i tấ ộ ố ượng BookDto t c s d li u khi bi từ ơ ở ữ ệ ế
BookID
public BookDto GetBook(string stringBookID)
{
// Kh i t o đ i tở ạ ố ượng k t n iế ố
OleDbConnection oledbCon = DataProvider.ConnectionData(); // Kh i t o và gán giá tr cho chu i truy v n c s d li uở ạ ị ỗ ấ ơ ở ữ ệ
string strSQL = "Select * From Book Where BookID = ?";
// Kh i t o đ i tở ạ ố ượng OleDBCommand th c thi v i tham s làự ớ ố chu i truy v n và đ i tỗ ấ ố ượng k t n iế ố
OleDbCommand oledbCmd = new OleDbCommand(strSQL, oledbCon);
// Gán tham s cho các trố ường
// Gán tham s cho AuthorIDố
oledbCmd.Parameters.Add("@BookID", OleDbType.WChar); oledbCmd.Parameters["@BookID"].Value = stringBookID;
// Kh i t o đ i tở ạ ố ượng OleDBDataReader th c thi có truy v n câuự ấ
l nhệ
OleDbDataReader oledbDtr = oledbCmd.ExecuteReader();
// Kh i t o đ i tở ạ ố ượng AuthorDto
BookDto bookDto = new BookDto();
// Trong khi đ i tố ượng OleDBDataReader còn có th đ cể ọ
while (oledbDtr.Read())
{
// Gán giá tr cho đ i tị ố ượng BookDto
// Gán giá tr cho BookIDị
bookDto.ID = (string)oledbDtr["BookID"];
// Gán giá tr cho BookNameị
bookDto.Name = (string)oledbDtr["BookName"];
Trang 4// Gán giá tr cho BookDateOfPuslishị
bookDto.DateOfPuslish =
(string)oledbDtr["BookDateOfPuslish"];
// Gán giá tr cho BookPriceị
bookDto.Price = (string)oledbDtr["BookPrice"];
// Gán giá tr cho BookStatusị
bookDto.Status = (string)oledbDtr["BookStatus"];
// Gán giá tr cho BookAmountị
bookDto.Amount = (string)oledbDtr["BookAmount"];
// Gán giá tr cho BookRemainị
bookDto.Remain = (string)oledbDtr["BookRemain"];
// Gán giá tr cho BookDecriptionị
bookDto.Decription = (string)oledbDtr["BookDecription"]; // Gán giá tr cho BookAuthorIDị
bookDto.AuthorID = (string)oledbDtr["BookAuthorID"];
// Gán giá tr cho BookCategoryIDị
bookDto.CategoryID = (string)oledbDtr["BookCategoryID"]; }
// Đóng k t n iế ố
oledbCon.Close();
// Tr v đ i tả ề ố ượng AuthorDto
return bookDto;
}
// Hàm thêm Book v i tham s là BookDtoớ ố
public void AddBook(BookDto bookDto)
{
// Kh i t o đ i tở ạ ố ượng k t n iế ố
OleDbConnection oledbCon = DataProvider.ConnectionData(); // Kh i t o và gán giá tr cho chu i truy v n c s d li uở ạ ị ỗ ấ ơ ở ữ ệ
string strSQL = "Insert Into Book( BookID, BookName,
BookDateOfPuslish, BookPrice, BookStatus, BookAmount,
BookRemain, BookDecription, BookAuthorID, BookCategoryID)
Values( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
// Kh i t o đ i tở ạ ố ượng OleDBCommand v i tham s là chu i truyớ ố ỗ
v n và đ i tấ ố ượng k t n iế ố
Trang 5OleDbCommand oledbCmd = new OleDbCommand(strSQL, oledbCon);
// Gán tham s cho các trố ường
// Gán tham s cho BookIDố
oledbCmd.Parameters.Add("@BookID", OleDbType.WChar); oledbCmd.Parameters["@BookID"].Value = bookDto.ID;
// Gán tham s cho BookNameố
oledbCmd.Parameters.Add("@BookName", OleDbType.WChar); oledbCmd.Parameters["@BookName"].Value = bookDto.Name; // Gán tham s cho BookDateOfPuslishố
oledbCmd.Parameters.Add("@BookDateOfPuslish",
OleDbType.WChar);
oledbCmd.Parameters["@BookDateOfPuslish"].Value =
bookDto.DateOfPuslish;
// Gán tham s cho BookPriceố
oledbCmd.Parameters.Add("@BookPrice", OleDbType.WChar); oledbCmd.Parameters["@BookPrice"].Value = bookDto.Price; // Gán tham s cho BookStatusố
oledbCmd.Parameters.Add("@BookStatus", OleDbType.WChar); oledbCmd.Parameters["@BookStatus"].Value = bookDto.Status; // Gán tham s cho BookAmountố
oledbCmd.Parameters.Add("@BookAmount",
OleDbType.WChar);
oledbCmd.Parameters["@BookAmount"].Value =
bookDto.Amount;
// Gán tham s cho BookRemainố
oledbCmd.Parameters.Add("@BookRemain",
OleDbType.WChar);
oledbCmd.Parameters["@BookRemain"].Value =
bookDto.Remain;
// Gán tham s cho BookDecriptionố
oledbCmd.Parameters.Add("@BookDecription",
OleDbType.WChar);
oledbCmd.Parameters["@BookDecription"].Value =
bookDto.Decription;
// Gán tham s cho BookAuthorIDố
Trang 6oledbCmd.Parameters.Add("@BookAuthorID",
OleDbType.WChar);
oledbCmd.Parameters["@BookAuthorID"].Value =
bookDto.AuthorID;
// Gán tham s cho BookCategoryIDố
oledbCmd.Parameters.Add("@BookCategoryID",
OleDbType.WChar);
oledbCmd.Parameters["@BookCategoryID"].Value =
bookDto.CategoryID;
// Th c thi không truy v n c s d li u b ng đ i tự ấ ơ ở ữ ệ ằ ố ượ ng
OleDBCommand
oledbCmd.ExecuteNonQuery();
// Đóng k t n iế ố
oledbCon.Close();
}
// Hàm xóa m t Book khi bi t BookIDộ ế
public void DeleteBook(string stringBookID)
{
// Kh i t o đ i tở ạ ố ượng k t n iế ố
OleDbConnection oledbConnection =
DataProvider.ConnectionData();
// Kh i t o và gán giá tr cho chu i truy v n c s d li uở ạ ị ỗ ấ ơ ở ữ ệ string stringSql = "Delete * From Book Where BookID = ?";
// Kh i t o đ i tở ạ ố ượng OleDBCommand
OleDbCommand oledbCommand = new
OleDbCommand(stringSql, oledbConnection);
// Gán tham sô cho các trường
oledbCommand.Parameters.Add("@BookID",
OleDbType.WChar);
oledbCommand.Parameters["@BookID"].Value = stringBookID; // Th c thi không truy v n c s d li uự ấ ơ ở ữ ệ
Trang 7oledbCommand.ExecuteNonQuery();
// Đóng k t n iế ố
oledbConnection.Close();
}
// Hàm c p nh t thông tin Bookậ ậ
public void UpdateBook(BookDto bookDto)
{
// Kh i t o đ i tở ạ ố ượng k t n i c s d li uế ố ơ ở ữ ệ
OleDbConnection oledbConnection =
DataProvider.ConnectionData();
// Kh i t o và gán giá tr cho chu i truy v n c s d li uở ạ ị ỗ ấ ơ ở ữ ệ string stringSql = "Update Book Set BookName = ?,
BookDateOfPuslish = ?, BookPrice = ?, BookStatus = ?, BookAmount
= ?, BookRemain = ?, BookDecription = ?, BookAuthorID = ?,
BookCategoryID = ? Where BookID = ?";
// Kh i t o đ i tở ạ ố ượng OleDBCommand
OleDbCommand oledbCommand = new
OleDbCommand(stringSql, oledbConnection);
// Gán tham s cho các giá trố ị
// Gán tham s cho BookNameố
oledbCommand.Parameters.Add("@BookName",
OleDbType.WChar);
oledbCommand.Parameters["@BookName"].Value =
bookDto.Name;
// Gán tham s cho BookDateOfPuslishố
oledbCommand.Parameters.Add("@BookDateOfPuslish", OleDbType.WChar);
oledbCommand.Parameters["@BookDateOfPuslish"].Value = bookDto.DateOfPuslish;
// Gán tham s cho BookPriceố
oledbCommand.Parameters.Add("@BookPrice",
OleDbType.WChar);
oledbCommand.Parameters["@BookPrice"].Value =
bookDto.Price;
// Gán tham s cho BookStatusố
Trang 8oledbCommand.Parameters.Add("@BookStatus",
OleDbType.WChar);
oledbCommand.Parameters["@BookStatus"].Value =
bookDto.Status;
// Gán tham s cho BookAmountố
oledbCommand.Parameters.Add("@BookAmount",
OleDbType.WChar);
oledbCommand.Parameters["@BookAmount"].Value =
bookDto.Amount;
// Gán tham s cho BookRemainố
oledbCommand.Parameters.Add("@BookRemain",
OleDbType.WChar);
oledbCommand.Parameters["@BookRemain"].Value =
bookDto.Remain;
// Gán tham s cho BookDecriptionố
oledbCommand.Parameters.Add("@BookDecription",
OleDbType.WChar);
oledbCommand.Parameters["@BookDecription"].Value = bookDto.Decription;
// Gán tham s cho BookAuthorIDố
oledbCommand.Parameters.Add("@BookAuthorID",
OleDbType.WChar);
oledbCommand.Parameters["@BookAuthorID"].Value = bookDto.AuthorID;
// Gán tham s cho BookCategoryIDố
oledbCommand.Parameters.Add("@BookCategoryID",
OleDbType.WChar);
oledbCommand.Parameters["@BookCategoryID"].Value = bookDto.CategoryID;
// Gán tham s cho BookIDố
oledbCommand.Parameters.Add("@BookID",
OleDbType.WChar);
oledbCommand.Parameters["@BookID"].Value = bookDto.ID;
// Th c thi chu i truy v n c s d li uự ỗ ấ ơ ở ữ ệ
oledbCommand.ExecuteNonQuery();
// Đóng k t n iế ố
Trang 9oledbConnection.Close();
sqlconnection.Open()//mo chuoi ket noi
}
}
}
K thu t l p trình 3.0 v i C#ỹ ậ ậ ớ
Ngườ ậi l p trình đã d dàng ti p c n v i l p trình FP do nhi u k thu tễ ế ậ ớ ậ ề ỹ ậ trong C# 3.0 có đi m chung v i FP Đ i v i ngể ớ ố ớ ườ ậi l p trình OOP, c mả
nh n đ u tiên khi làm vi c v i C# 3.0 là s thay đ i v cú pháp l pậ ầ ệ ớ ự ổ ề ậ trình v i các k thu t nh Anonymous type, Lambda Expression hayớ ỹ ậ ư Lazy evaluation K t h p các k thu t này l i v i nhau s gi m thi uế ợ ỹ ậ ạ ớ ẽ ả ể
s lố ượng công vi c và áp l c công vi c cho ngệ ự ệ ườ ậi l p trình, đ ng th iồ ờ làm tăng tính hi u qu c a s n ph m do code nh , g n,ệ ả ủ ả ẩ ỏ ọ
Type Inference – Anonymous type:
Type Inference: Được dùng đ khai báo bi n v i t khóa “var” màể ế ớ ừ không c n đ nh nghĩa ki u d li u Trình biên d ch s t đ ng suy lu nầ ị ể ữ ệ ị ẽ ự ộ ậ
ki u b ng cách tham chi u đ n giá tr để ằ ế ế ị ược gán cho bi n Tuy nhiênế
ki u khai báo này ch để ỉ ượ ử ục s d ng trong ph m vi local.ạ
var Name =”An”;
var Age = “1/1/1980”;
var Numbers = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
Anonymous type: được xây d ng trên khái ni m “Tuple” - t p m t dãyự ệ ậ ộ
d li u Thí d dữ ệ ụ ưới đây có 3 Tuple
Name:An
salary:300
City: Ho Chi Minh
Anonymous type dùng đ đ nh nghĩa m t ki u d li u m i nh ngể ị ộ ể ữ ệ ớ ư
Trang 10không c n ch rõ tên và c u trúc d li u.ầ ỉ ấ ữ ệ
var myInfo = new {Name =”An”, Age=”1/1/1980”, Salary=300};
var mySalary = myInfo.Salary * 2;
Bi n myInfo đế ược kh i t o v i m t ki u d li u hoàn toàn m i nh ngở ạ ớ ộ ể ữ ệ ớ ư không đ nh nghĩa c u trúc rõ ràng Phép toán “var mySalary =ị ấ
myInfo.Salary*2” không gây ra l i b i trình biên d ch hi u rõ c u trúcỗ ở ị ể ấ
ki u d li u c a myInfo M t trong nh ng u đi m c a Anonymousể ữ ệ ủ ộ ữ ư ể ủ type là k t h p v i Type Inference trong vi c tham chi u d li u.ế ợ ớ ệ ế ữ ệ
ng d ng Type Inference – Anonymous type trong vi c tham chi u d
li u: các d án ít hay nhi u đ u liên quan đ n tệ ự ề ề ế ương tác v i d li u vàớ ữ ệ
ngườ ậi l p trình ph i vi t nh ng đo n mã đ l c m t t p d li u m iả ế ữ ạ ể ọ ộ ậ ữ ệ ớ
t t p d li u ban đ u T p d li u m i có th ít field h n hay có thừ ậ ữ ệ ầ ậ ữ ệ ớ ể ơ ể
k t h p v i t p d li u khác nhi u field h n Công vi c này đế ợ ớ ậ ữ ệ ề ơ ệ ược g iọ
là tham chi u hay “Projection” Trế ước đây công vi c này thệ ường t nố khá nhi u th i gian do ph i đ nh nghĩa c u trúc d li u, vi t mã l u dề ờ ả ị ấ ữ ệ ế ư ữ
li u vào c u trúc m i mà đôi khi c u trúc d li u m i ch s d ngệ ấ ớ ấ ữ ệ ớ ỉ ử ụ trong m t hàm Amonumous type tr nên r t hi u qu trong nh ng yêuộ ở ấ ệ ả ữ
c u nh th V i t p d li u thí d 4, yêu c u t o m t danh sáchầ ư ế ớ ậ ữ ệ ở ụ ầ ạ ộ
nh ng ngữ ười tên “Huy” và danh sách m i này v i ch l y hai field Nameớ ớ ỉ ấ
và Salary và thêm m t field m i Allowance có th x lý nh sau:ộ ớ ể ử ư
Thí d 8: ụ
var searchList = from r in people
where r.Name == “Huy”
select new { r.Name, r.Salary, Allowance = r.Salary * 0.7 };
Ki u d li u m i “searchList” v i 3 field “Name, Salary, Allowance”ể ữ ệ ớ ớ
đượ ạc t o mà không c n đòi h i quá nhi u th i gian cho vi c đ nh nghĩaầ ỏ ề ờ ệ ị
c u trúc, vi t code hay phát hi n l i Tuy nhiên “Anonymous type” chấ ế ệ ỗ ỉ
s d ng trong pham vi local.ử ụ
Lambda Expression: Anonymous method h tr cách vi t inline codeỗ ợ ế
nh ng ch a có s thay đ i đáng k v cú pháp câu l nh Lambdaư ư ự ổ ể ề ệ
Expression là s phát tri n c a Anonymous method, giúp gi i quy tự ể ủ ả ế
Trang 11gánh n ng c a ngặ ủ ườ ậi l p trình trong vi c vi t các đo n mã Có thệ ế ạ ể
hi u Lambda Expression nh m t hàm mang các bi n s Cú pháp “x =>ể ư ộ ế ố x+1” gi ng nh hàm có m t bi n “x” và giá tr tr v c a hàm là “x+1”.ố ư ộ ế ị ả ề ủ Lambda Expression được xây d ng trên n n c a lý thuy t “Lambdaự ề ủ ế calculus” được phát minh trong th p niên 1930 Kí t Lambda (?) c aậ ự ủ
người Hy L p đạ ược dùng đ t phía trặ ước các bi n s c a hàm Thí dế ố ủ ụ
dưới đây bi u di n hàm m t bi n và hàm hai bi n b ng Lambdaể ễ ộ ế ế ằ
Expression và cú pháp trong ngôn ng C# 3.0.ữ
f(x) = x f(x,y) = x + y
Lambda Expression x ? x (x,y) ? x + y
C# 3.0 x => x (x,y) => x + y
Nh vào cú pháp đ n gi n, nên dòng l nh cũng đ n gi n.ờ ơ ả ệ ơ ả
Thí du 9:
Func Add = (x, y) => x + y;
Lambda Expression có th không có m t tham s (parameter) nào ho cể ộ ố ặ
có nhi u parameter và các parameter này cũng có th đề ể ược khai báo
ki u ho c không c n khai báo ki u.ể ặ ầ ể
n => (n-1)*(n-2)
x => (x % 2) == 0
(int x) => (x % 2) == 0
p => p.Name == “Huy” && p.Age > 25
Các k thu t Closure hay Currying đ u có th s d ng trong Lambdaỹ ậ ề ể ử ụ Expression
Closure trong Lambda Expression là kh năng hi u và ki m soát bi nả ể ể ế không n m trong ph m vi c a bi u th c.ằ ạ ủ ể ứ
Thí d 10: ụ
int x = 99;
Func add = y => y + x;
int firstResult = add(1); // 99 + 1 = 100
int secondResult = add(2); // 99 + 2 = 101