background img

Bài Viết Mới

Hiển thị các bài đăng có nhãn Lập Trình Desktop. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn Lập Trình Desktop. Hiển thị tất cả bài đăng
Trong bài này, chúng ta tìm hiểu những khái niệm khái quát, giản đơn để bạn có thể nắm rõ Entity Framework nhanh chóng nếu bạn là người mới.

  • EF với version đầu tiên đi kèm với .NET 3.5 trong bộ Visual Studio 2008, phát hành 11/2008. Ở lần đầu ra mắt này, nó nhận được đánh giá không mấy tốt đẹp của các nhà phát triển.

  • Version tiếp theo là EF4.0 phát hành cùng .NET 4.0 vào 12/04/2010. Cập nhật một số hạn chế ở phiên bản đầu tiên.

  • Version thứ 3 của EF là version 4.1,phát hành vào 12/04/2011. Lần phát hành này có dấu ấn quan trọng là hỗ trợ Code First (Sử dụng code để làm việc với EF không dùng Tools)

  • Cứ thế các phiên bản khác ra đời v4.1, v4.3.1,v5.0,v6.0 và bây giờ là version 6.1

  • Tham khảo thêm tại: Wikipedia


 Entity Framework Dùng Làm Gì ?


- Chúng ta dùng EF để truy xuất dữ liệu (Accessing Data).

Trước đó để truy xuất dữ liệu các nhà phát triển thường sử dụng:Raw Data, Driect APIs,OLEDB, ODBC, Embedded SQL, ADO, Stored Procedure, ADO.NET, Datasets, DataReade, LINQ Và bây giờ với EF là O/RM

- Mục đích che dấu sự phức tạp bên dưới và đưa ra cách làm việc thống nhất, hiện đại, nhanh gọn.

 

Lợi Ích Sử Dụng Entity Framework ?


- Năng suất làm việc được đẩy nhanh hơn

- Giữ tính độc lập cho cơ sở dữ liệu

(Điều đó không có nghĩa EF là giải pháp duy nhất tốt trong các vấn đề cũng như nó không phải là nhanh nhất trong công việc. Trong một số trường hợp bạn cần có các thiết lập đúng đắn )

- Cho phép làm việc với nhiều hệ quản trị cơ sở dữ liệu SQL Server, MySQL, DB, Oracle ....

 

Vậy Entity Framework Là Gì ?


- Entity Framework là O/RM  (Object Relational Mapping )  trong .NET Framwork . Có thể nói là tốt nhất trong việc truy xuất dữ liệu trên .NET

- Là công nghệ  Microsoft thường được sử dụng trong : WCF Data services,
Azure Table Storage, Sharepoint 2010, SQL Server Reporting Services and
PowerPivot for Excel, …

- EF là công nghệ cho phép bạn làm việc với CSDL quan hệ.

Một Số Khái Niệm Cần Lưu Ý Khi Làm Việc Với Entity Framework


Entity Data Model


Được phát minh bởi TS. Peter Chen năm  1970 và được đặt tên là ERM (Entity Relationship Model).

Sau này trong Entity FrameWork được gọi là EDM (Entity Data Model)

- Conceptual model: (Phần mở rộng *.CSDL) là các các class model và các relationships của chúng. Nó độc lập với thiết kế Table trong cơ sở dữ liệu của bạn.

- Mapping: (Phần mở rộng *.MSL) nó bao gồm các thông tin về Conceptual model ánh xạ lên Storage model.

- Storage model: (Phần mở rộng *.SSDL) là mô hình thiết kế cơ sở dữ liệu của bạn nó bao gồm các Tables, Views, Stored Procedures, Relationships, Keys

Object Relation Mapping


- Thứ nhất ORM là một công cụ được áp dụng trong Entity Framework

- ORM sử dụng thông tin Metadata để giao tiếp với cơ sở dữ liệu. Nhờ vậy, bạn không cần biết cấu trúc bên dưới của cơ sở dữ liệu. ORM là công cụ trung gian để che dấu đi sự phức tạp đó cho bạn.

- Nó là cơ chế anh xạ nên phần quan trọng nhất của ORM chính là mapping. Hiểu đơn giản ORM là trung gian cho việc ánh xạ từ bản thiết kế EDM xuống Database


Quy Trình Làm Việc Với Entity FrameWork ?


Tòm tắt lại, có ba cách làm việc với Entity Framework:

- Database First: Trong trường hợp bạn muốn làm việc với database đã có sẵn. Dùng công cụ thiết kế có sẵn trong Visual Studio để generated từ database ra bản thiết kế model.

- Model First: Trong trường hợp này, chúng ta sẽ làm việc trên visual studio và tạo ra database mới tại đây. Dùng công cụ để generated code từ bản thiết kế model ra database

- Code First: Riêng với cách này bạn có 2 lựa chọn, làm việc với database có sẵn hoặc sẽ tạo mới. Nhưng dù làm với cách nào, chúng ta cũng dùng codebehind để xử lý là chính. Không dùng các tool, giao diện trực quan giống như 2 cách bên trên.

References:

[1] http://www.entityframeworktutorial.net/EntityFramework-Architecture.aspx

[2] http://entityframework.codeplex.com/

[3] http://msdn.microsoft.com/en-us/library/bb399567%28v=vs.110%29.aspx




 
Nguồn: Tự Học IT Online - http://tuhocit.net

ADO.NET Entity Framework: Tìm Hiểu Khái Quát

Trong bài này, chúng ta tìm hiểu những khái niệm khái quát, giản đơn để bạn có thể nắm rõ Entity Framework nhanh chóng nếu bạn là người mới.

  • EF với version đầu tiên đi kèm với .NET 3.5 trong bộ Visual Studio 2008, phát hành 11/2008. Ở lần đầu ra mắt này, nó nhận được đánh giá không mấy tốt đẹp của các nhà phát triển.

  • Version tiếp theo là EF4.0 phát hành cùng .NET 4.0 vào 12/04/2010. Cập nhật một số hạn chế ở phiên bản đầu tiên.

  • Version thứ 3 của EF là version 4.1,phát hành vào 12/04/2011. Lần phát hành này có dấu ấn quan trọng là hỗ trợ Code First (Sử dụng code để làm việc với EF không dùng Tools)

  • Cứ thế các phiên bản khác ra đời v4.1, v4.3.1,v5.0,v6.0 và bây giờ là version 6.1

  • Tham khảo thêm tại: Wikipedia


 Entity Framework Dùng Làm Gì ?


- Chúng ta dùng EF để truy xuất dữ liệu (Accessing Data).

Trước đó để truy xuất dữ liệu các nhà phát triển thường sử dụng:Raw Data, Driect APIs,OLEDB, ODBC, Embedded SQL, ADO, Stored Procedure, ADO.NET, Datasets, DataReade, LINQ Và bây giờ với EF là O/RM

- Mục đích che dấu sự phức tạp bên dưới và đưa ra cách làm việc thống nhất, hiện đại, nhanh gọn.

 

Lợi Ích Sử Dụng Entity Framework ?


- Năng suất làm việc được đẩy nhanh hơn

- Giữ tính độc lập cho cơ sở dữ liệu

(Điều đó không có nghĩa EF là giải pháp duy nhất tốt trong các vấn đề cũng như nó không phải là nhanh nhất trong công việc. Trong một số trường hợp bạn cần có các thiết lập đúng đắn )

- Cho phép làm việc với nhiều hệ quản trị cơ sở dữ liệu SQL Server, MySQL, DB, Oracle ....

 

Vậy Entity Framework Là Gì ?


- Entity Framework là O/RM  (Object Relational Mapping )  trong .NET Framwork . Có thể nói là tốt nhất trong việc truy xuất dữ liệu trên .NET

- Là công nghệ  Microsoft thường được sử dụng trong : WCF Data services,
Azure Table Storage, Sharepoint 2010, SQL Server Reporting Services and
PowerPivot for Excel, …

- EF là công nghệ cho phép bạn làm việc với CSDL quan hệ.

Một Số Khái Niệm Cần Lưu Ý Khi Làm Việc Với Entity Framework


Entity Data Model


Được phát minh bởi TS. Peter Chen năm  1970 và được đặt tên là ERM (Entity Relationship Model).

Sau này trong Entity FrameWork được gọi là EDM (Entity Data Model)

- Conceptual model: (Phần mở rộng *.CSDL) là các các class model và các relationships của chúng. Nó độc lập với thiết kế Table trong cơ sở dữ liệu của bạn.

- Mapping: (Phần mở rộng *.MSL) nó bao gồm các thông tin về Conceptual model ánh xạ lên Storage model.

- Storage model: (Phần mở rộng *.SSDL) là mô hình thiết kế cơ sở dữ liệu của bạn nó bao gồm các Tables, Views, Stored Procedures, Relationships, Keys

Object Relation Mapping


- Thứ nhất ORM là một công cụ được áp dụng trong Entity Framework

- ORM sử dụng thông tin Metadata để giao tiếp với cơ sở dữ liệu. Nhờ vậy, bạn không cần biết cấu trúc bên dưới của cơ sở dữ liệu. ORM là công cụ trung gian để che dấu đi sự phức tạp đó cho bạn.

- Nó là cơ chế anh xạ nên phần quan trọng nhất của ORM chính là mapping. Hiểu đơn giản ORM là trung gian cho việc ánh xạ từ bản thiết kế EDM xuống Database


Quy Trình Làm Việc Với Entity FrameWork ?


Tòm tắt lại, có ba cách làm việc với Entity Framework:

- Database First: Trong trường hợp bạn muốn làm việc với database đã có sẵn. Dùng công cụ thiết kế có sẵn trong Visual Studio để generated từ database ra bản thiết kế model.

- Model First: Trong trường hợp này, chúng ta sẽ làm việc trên visual studio và tạo ra database mới tại đây. Dùng công cụ để generated code từ bản thiết kế model ra database

- Code First: Riêng với cách này bạn có 2 lựa chọn, làm việc với database có sẵn hoặc sẽ tạo mới. Nhưng dù làm với cách nào, chúng ta cũng dùng codebehind để xử lý là chính. Không dùng các tool, giao diện trực quan giống như 2 cách bên trên.

References:

[1] http://www.entityframeworktutorial.net/EntityFramework-Architecture.aspx

[2] http://entityframework.codeplex.com/

[3] http://msdn.microsoft.com/en-us/library/bb399567%28v=vs.110%29.aspx




 
Nguồn: Tự Học IT Online - http://tuhocit.net

Phần này, chúng ta bước vào phần chính của ADO.NET. Đó là làm việc với mô hình phi kết nối nhưng trước hết trong ví dụ dưới đây ta sẽ bỏ qua việc lưu trữ vào XML mà tạm thời dùng bộ nhớ tạm thôi.

Có nghĩa là, dữ liệu từ database được lấy lên và đổ vào Dataset. Sau đó ta có thể ngắt kết nối tới database, lúc này dữ liệu tạm thời nằm ở dataset và ta sẽ thao tác với nó (Thêm, Sửa, Xóa). Sau khi thao tác xong, bạn có thể đồng bộ với database vẫn thông qua DataApdater nhưng trong ví dụ dưới đây chúng ta dùng SqlCommandBuilder để làm việc ngầm cho chúng ta, giảm bớt thao tác code.

Mã Code trong mô hình phi kết nối dưới đây bao gồm các bước.

  • Kết nối với SQL Server

  • Tạo Dataset bao gồm một hoặc nhiểu Table tương ứng để chứa dữ liệu được tải lên.

  • Tải dữ liệu từ database lên và đổ chúng vào dataset với các Table tương ứng.

  • Ngắt kết nối với SQL Server

  • Thao tác thêm, sửa, xóa trên dataset. Hiển thị thông qua Gridview.

  • Lưu dữ liệu từ Dataset vào XML

  • Đồng bộ xuống database. Done !


 

Data Apdater

Đối với DataApdater là cầu nối giữa dataset và database nhưng với mỗi đối tượng data apdater chỉ xử lý 1 bảng trong dataset.
Bạn cần lưu ý điểm này, không dùng chung trên các bảng dữ liệu khác nhau. Vẫn có phương pháp để sử dụng một đối tượng Data apdater nhưng chúng ta sẽ tạm thời không tìm hiểu tại ví dụ này. Enjoy !


1. Kết Nối Server

- Trong các ví dụ trước ta đã biết cách kết nối tới database. Ở đây vẫn dùng cách đó, bạn hãy tham khảo lại.

2. Khởi Tạo Dataset

Trước đó trong class của chúng ta đã khai báo lớp dataset dùng cho toàn class.

private DataSet _dataset;

 
private void ManualDataset()
{
// B1: Tạo mới đối tượng Dataset. Với tên do bạn chỉ định hoặc để trống
_dataset = new DataSet("MyDataClient");

// B2: Tạo mới một bảng để thêm vào dataset ở trên
var table1 = new DataTable("SinhVien");

// B3: Add table SinhVien vừa tạo vào dataset MyDataClient
_dataset.Tables.Add(table1);

// B4: Tạo cột (column). Riêng hàng (row) dùng để làm việc với dữ liệu, vì nó đại diện cho một hàng. Ta dùng nó để thao tác Insert, Update, Delete
var col11 = new DataColumn("MaSV", typeof(string));
var col12 = new DataColumn("HoTenSV", typeof(string));
var col13 = new DataColumn("NgaySinh", typeof(DateTime));
var col14 = new DataColumn("QueQuan", typeof(string));
var col15 = new DataColumn("MaKhoa", typeof(string));

// B5: Add column vào table SinhVien trong dataset: MyDataClient
table1.Columns.Add(col11);
table1.Columns.Add(col12);
table1.Columns.Add(col13);
table1.Columns.Add(col14);
table1.Columns.Add(col15);
//table.Columns.Add("MaSV", Type.GetType("System.String"));

/*************************************************************************************************/
//Tương tự ta tạo tiếp bảng Khoa và add vào dataset MyDataClient
var table2 = new DataTable("Khoa");
_dataset.Tables.Add(table2);
var col21 = new DataColumn("MaKhoa", typeof(string));
var col22 = new DataColumn("TenKhoa", typeof(string));

table2.Columns.Add(col21);
table2.Columns.Add(col22);
}

Hàm trên là một cách tùy chỉnh cho bạn hiểu dataset gồm những gì. Hãy đặt vào hàm Form_Load để nó được khởi tạo luôn lúc chương trình khởi động hoặc thực thi trước khi tải dữ liệu từ database lên.

3. Tải Dữ Liệu Lên Và Đổ Vào Dataset

Ta sẽ tải cả hai bảng SinhVien, Khoa. Riêng bảng SinhVien cần thêm, sửa, xóa nên ta dùng thêm SqlCommandbuilder. Nếu bảng khoa thao tác, bạn làm tương tự.
private void GetAllTableToDataset()
{
/* Phần A: Xử lý với bảng SinhVien
* B1: Thông qua SqlDataApdater và SqlConnection lấy dữ liệu lên
* B2: Nạp đối tượng SqlDataApdater mà chúng ta đã khởi tạo dành riêng cho SinhVien vào SqlCommandBuilder ...
* ...để nó làm việc ngầm cho ta. Như thế việc đồng bộ từ dataset <=> database sẽ đơn giản hơn.
* B3: Đổ dữ liệu đã lấy được vào _dataset.Table["SinhVien"]. Trước đó ta đã khởi tạo 2 table trong dataset thứ tự 0,1.....
* B4: Có thể đổ dữ liệu từ Table trong Dataset ra GridView để xem cụ thể
*/

_dasinhvien = new SqlDataAdapter
{
SelectCommand = new SqlCommand("SELECT * FROM SinhVien", _con)
};
_cmdbdsinhvien = new SqlCommandBuilder(_dasinhvien);

_dasinhvien.Fill(_dataset.Tables["SinhVien"]);
gvSinhVien.DataSource = _dataset.Tables[0]; // Table[0] tương đương Table["SinhVien"]

/* Phần B: Xử lý với bảng Khoa*/
_dakhoa = new SqlDataAdapter
{
SelectCommand = new SqlCommand("SELECT * FROM Khoa", _con)
};
_dakhoa.Fill(_dataset, "Khoa");
//Đổ ra Combbobox
cbbMakhoa.DataSource = _dataset.Tables[1];
cbbMakhoa.ValueMember = _dataset.Tables[1].Columns[0].ColumnName; //MaKhoa
cbbMakhoa.DisplayMember = "TenKhoa"; // Tương tự lệnh trên ;))
// Đổ ra Gridview
gvKhoa.DataSource = _dataset.Tables[1]; // Table[1] tương đương Table["Khoa"]
}

4. Ngắt Kết Nối Tới Server

Sau khi tải dữ liệu xong và đổ vào dataset thì ngắt kết nối. Gọi hàm ngắt kết nối, OK

5. Thao Tác Dữ Liệu Trên Dataset

Bao gồm các thao tác cơ bản: Insert, Update, Delete.

Yên tâm là bạn có thể thêm, bớt thoải mái nhiểu record trước khi qua bước cập nhật xuống database.

Ở bước này, bạn có thể code thêm mã xử lý việc hoàn nguyên dataset nếu như ta ko muốn lưu bằng cách đơn giản nhất là Clear() Table đó trong dataset và tải lại.

a. hàm thêm mới dữ liệu.
private void InsertDataset()
{
var datarow = _dataset.Tables["SinhVien"].NewRow();
datarow[0] = txtMasv.Text;
datarow[1] = txtHoten.Text;
datarow[2] = dtpNgaysinh.Text;
datarow[3] = txtQuequan.Text;
datarow[4] = cbbMakhoa.SelectedValue;
_dataset.Tables[0].Rows.Add(datarow);

}

Đầu vào từ các control : Textbox, Combbobox.....

b. sửa dữ liệu ban đầu
private void UpdateDataset()
{

var temp = txtMasv.Text;
var datarows = _dataset.Tables[0].Select("MaSV =" + "'" + temp + "'");
datarows[0][1] = txtHoten.Text;
datarows[0][2] = dtpNgaysinh.Text;
datarows[0][3] = txtQuequan.Text;
datarows[0][4] = cbbMakhoa.SelectedValue;
// Gán như vậy có nghĩa. Row[vị trí hàng][vị trí cột] của Table[vị trí] của Dataset đã được thay đổi.

}

c. xóa dữ liệu
private void DeleteDataset()
{
if (gvSinhVien.CurrentRow != null)
_dataset.Tables[0].Rows[gvSinhVien.CurrentRow.Index].Delete();
}

Cách này lấy vị trí record trên Gridview của bạn và xóa nó trong Table của Dataset.

Cách khác bạn xác định vị trí index của record trong table thông qua MaSV nhập vào.
var temp = txtMasv.Text;
var datarows = _dataset.Tables[0].Select("MaSV =" + "'" + temp + "'");
foreach (var datarow in datarows)
{
var index = _dataset.Tables[0].Rows.IndexOf(datarow);
_dataset.Tables[0].Rows[index].Delete();
}

6. Đồng Bộ Dataset Với Databbase

Dùng lệnh update của Data Apdater:
 _dasinhvien.Update(_dataset, "SinhVien");

Như vậy quá trình thực thi của mô hình này đã hoàn tất.

Demo

DemoDisconnectModel




Cập nhật: 03/03/2014

Hãy tải về mã nguồn của ví dụ 2.2.1 này để thực hành.  Database vẫn dùng ở các ví dụ trước.
Nguồn: Tự Học IT Online - http://tuhocit.net

ADO.NET Mô Hình Phi Kết Nối Với SQL Server – Phần 2.2.1

Phần này, chúng ta bước vào phần chính của ADO.NET. Đó là làm việc với mô hình phi kết nối nhưng trước hết trong ví dụ dưới đây ta sẽ bỏ qua việc lưu trữ vào XML mà tạm thời dùng bộ nhớ tạm thôi.

Có nghĩa là, dữ liệu từ database được lấy lên và đổ vào Dataset. Sau đó ta có thể ngắt kết nối tới database, lúc này dữ liệu tạm thời nằm ở dataset và ta sẽ thao tác với nó (Thêm, Sửa, Xóa). Sau khi thao tác xong, bạn có thể đồng bộ với database vẫn thông qua DataApdater nhưng trong ví dụ dưới đây chúng ta dùng SqlCommandBuilder để làm việc ngầm cho chúng ta, giảm bớt thao tác code.

Mã Code trong mô hình phi kết nối dưới đây bao gồm các bước.

  • Kết nối với SQL Server

  • Tạo Dataset bao gồm một hoặc nhiểu Table tương ứng để chứa dữ liệu được tải lên.

  • Tải dữ liệu từ database lên và đổ chúng vào dataset với các Table tương ứng.

  • Ngắt kết nối với SQL Server

  • Thao tác thêm, sửa, xóa trên dataset. Hiển thị thông qua Gridview.

  • Lưu dữ liệu từ Dataset vào XML

  • Đồng bộ xuống database. Done !


 

Data Apdater

Đối với DataApdater là cầu nối giữa dataset và database nhưng với mỗi đối tượng data apdater chỉ xử lý 1 bảng trong dataset.
Bạn cần lưu ý điểm này, không dùng chung trên các bảng dữ liệu khác nhau. Vẫn có phương pháp để sử dụng một đối tượng Data apdater nhưng chúng ta sẽ tạm thời không tìm hiểu tại ví dụ này. Enjoy !


1. Kết Nối Server

- Trong các ví dụ trước ta đã biết cách kết nối tới database. Ở đây vẫn dùng cách đó, bạn hãy tham khảo lại.

2. Khởi Tạo Dataset

Trước đó trong class của chúng ta đã khai báo lớp dataset dùng cho toàn class.

private DataSet _dataset;

 
private void ManualDataset()
{
// B1: Tạo mới đối tượng Dataset. Với tên do bạn chỉ định hoặc để trống
_dataset = new DataSet("MyDataClient");

// B2: Tạo mới một bảng để thêm vào dataset ở trên
var table1 = new DataTable("SinhVien");

// B3: Add table SinhVien vừa tạo vào dataset MyDataClient
_dataset.Tables.Add(table1);

// B4: Tạo cột (column). Riêng hàng (row) dùng để làm việc với dữ liệu, vì nó đại diện cho một hàng. Ta dùng nó để thao tác Insert, Update, Delete
var col11 = new DataColumn("MaSV", typeof(string));
var col12 = new DataColumn("HoTenSV", typeof(string));
var col13 = new DataColumn("NgaySinh", typeof(DateTime));
var col14 = new DataColumn("QueQuan", typeof(string));
var col15 = new DataColumn("MaKhoa", typeof(string));

// B5: Add column vào table SinhVien trong dataset: MyDataClient
table1.Columns.Add(col11);
table1.Columns.Add(col12);
table1.Columns.Add(col13);
table1.Columns.Add(col14);
table1.Columns.Add(col15);
//table.Columns.Add("MaSV", Type.GetType("System.String"));

/*************************************************************************************************/
//Tương tự ta tạo tiếp bảng Khoa và add vào dataset MyDataClient
var table2 = new DataTable("Khoa");
_dataset.Tables.Add(table2);
var col21 = new DataColumn("MaKhoa", typeof(string));
var col22 = new DataColumn("TenKhoa", typeof(string));

table2.Columns.Add(col21);
table2.Columns.Add(col22);
}

Hàm trên là một cách tùy chỉnh cho bạn hiểu dataset gồm những gì. Hãy đặt vào hàm Form_Load để nó được khởi tạo luôn lúc chương trình khởi động hoặc thực thi trước khi tải dữ liệu từ database lên.

3. Tải Dữ Liệu Lên Và Đổ Vào Dataset

Ta sẽ tải cả hai bảng SinhVien, Khoa. Riêng bảng SinhVien cần thêm, sửa, xóa nên ta dùng thêm SqlCommandbuilder. Nếu bảng khoa thao tác, bạn làm tương tự.
private void GetAllTableToDataset()
{
/* Phần A: Xử lý với bảng SinhVien
* B1: Thông qua SqlDataApdater và SqlConnection lấy dữ liệu lên
* B2: Nạp đối tượng SqlDataApdater mà chúng ta đã khởi tạo dành riêng cho SinhVien vào SqlCommandBuilder ...
* ...để nó làm việc ngầm cho ta. Như thế việc đồng bộ từ dataset <=> database sẽ đơn giản hơn.
* B3: Đổ dữ liệu đã lấy được vào _dataset.Table["SinhVien"]. Trước đó ta đã khởi tạo 2 table trong dataset thứ tự 0,1.....
* B4: Có thể đổ dữ liệu từ Table trong Dataset ra GridView để xem cụ thể
*/

_dasinhvien = new SqlDataAdapter
{
SelectCommand = new SqlCommand("SELECT * FROM SinhVien", _con)
};
_cmdbdsinhvien = new SqlCommandBuilder(_dasinhvien);

_dasinhvien.Fill(_dataset.Tables["SinhVien"]);
gvSinhVien.DataSource = _dataset.Tables[0]; // Table[0] tương đương Table["SinhVien"]

/* Phần B: Xử lý với bảng Khoa*/
_dakhoa = new SqlDataAdapter
{
SelectCommand = new SqlCommand("SELECT * FROM Khoa", _con)
};
_dakhoa.Fill(_dataset, "Khoa");
//Đổ ra Combbobox
cbbMakhoa.DataSource = _dataset.Tables[1];
cbbMakhoa.ValueMember = _dataset.Tables[1].Columns[0].ColumnName; //MaKhoa
cbbMakhoa.DisplayMember = "TenKhoa"; // Tương tự lệnh trên ;))
// Đổ ra Gridview
gvKhoa.DataSource = _dataset.Tables[1]; // Table[1] tương đương Table["Khoa"]
}

4. Ngắt Kết Nối Tới Server

Sau khi tải dữ liệu xong và đổ vào dataset thì ngắt kết nối. Gọi hàm ngắt kết nối, OK

5. Thao Tác Dữ Liệu Trên Dataset

Bao gồm các thao tác cơ bản: Insert, Update, Delete.

Yên tâm là bạn có thể thêm, bớt thoải mái nhiểu record trước khi qua bước cập nhật xuống database.

Ở bước này, bạn có thể code thêm mã xử lý việc hoàn nguyên dataset nếu như ta ko muốn lưu bằng cách đơn giản nhất là Clear() Table đó trong dataset và tải lại.

a. hàm thêm mới dữ liệu.
private void InsertDataset()
{
var datarow = _dataset.Tables["SinhVien"].NewRow();
datarow[0] = txtMasv.Text;
datarow[1] = txtHoten.Text;
datarow[2] = dtpNgaysinh.Text;
datarow[3] = txtQuequan.Text;
datarow[4] = cbbMakhoa.SelectedValue;
_dataset.Tables[0].Rows.Add(datarow);

}

Đầu vào từ các control : Textbox, Combbobox.....

b. sửa dữ liệu ban đầu
private void UpdateDataset()
{

var temp = txtMasv.Text;
var datarows = _dataset.Tables[0].Select("MaSV =" + "'" + temp + "'");
datarows[0][1] = txtHoten.Text;
datarows[0][2] = dtpNgaysinh.Text;
datarows[0][3] = txtQuequan.Text;
datarows[0][4] = cbbMakhoa.SelectedValue;
// Gán như vậy có nghĩa. Row[vị trí hàng][vị trí cột] của Table[vị trí] của Dataset đã được thay đổi.

}

c. xóa dữ liệu
private void DeleteDataset()
{
if (gvSinhVien.CurrentRow != null)
_dataset.Tables[0].Rows[gvSinhVien.CurrentRow.Index].Delete();
}

Cách này lấy vị trí record trên Gridview của bạn và xóa nó trong Table của Dataset.

Cách khác bạn xác định vị trí index của record trong table thông qua MaSV nhập vào.
var temp = txtMasv.Text;
var datarows = _dataset.Tables[0].Select("MaSV =" + "'" + temp + "'");
foreach (var datarow in datarows)
{
var index = _dataset.Tables[0].Rows.IndexOf(datarow);
_dataset.Tables[0].Rows[index].Delete();
}

6. Đồng Bộ Dataset Với Databbase

Dùng lệnh update của Data Apdater:
 _dasinhvien.Update(_dataset, "SinhVien");

Như vậy quá trình thực thi của mô hình này đã hoàn tất.

Demo

DemoDisconnectModel




Cập nhật: 03/03/2014

Hãy tải về mã nguồn của ví dụ 2.2.1 này để thực hành.  Database vẫn dùng ở các ví dụ trước.
Nguồn: Tự Học IT Online - http://tuhocit.net

Phần 2: CÁCH THỨC SỬ DỤNG ADO.NET
 

2.1.2 Mô Hình Kết Nối - Sử Dụng Stored Procedure


Ở phần trước (2.1.1) các bạn đã biết được cách connect ứng dụng tới CSDL. Hôm này, chúng ta lặp lại các thao tác đó, nhưng các câu lệnh SQL sẽ được đặt trên SQL Server. Ta gọi đó là các thủ tục Stored Procedure và ở trong codebehind (C#) ta chỉ cần gọi đến nó SQL SV sẽ thực hiện các lệnh thủ tục này.

ADO.NET Mô Hình Kết Nối Với SQL Server – Phần 2.1.2

Phần 2: CÁCH THỨC SỬ DỤNG ADO.NET
 

2.1.2 Mô Hình Kết Nối - Sử Dụng Stored Procedure


Ở phần trước (2.1.1) các bạn đã biết được cách connect ứng dụng tới CSDL. Hôm này, chúng ta lặp lại các thao tác đó, nhưng các câu lệnh SQL sẽ được đặt trên SQL Server. Ta gọi đó là các thủ tục Stored Procedure và ở trong codebehind (C#) ta chỉ cần gọi đến nó SQL SV sẽ thực hiện các lệnh thủ tục này.



Như đã nói, với ADO.NET có hai mô hình sử dụng phổ biến là: Kết Nối & Phi Kết Nối. Hôm nay, chúng ta sẽ tìm hiểu phần mô hình kết Nối.

Phần 2: CÁCH THỨC SỬ DỤNG ADO.NET 


2.1 - Mô Hình Kết Nối
 

   Phần này, chúng ta sẽ tìm hiểu cách thức sử dụng ADO.NET trong mô hình kết nối CSDL. Điều đó có nghĩa, ứng dụng của bạn phải luôn kết nối tới CSDL để thực hiện các thao tác (Chọn, thêm, sửa xóa ...). Và hãy nhớ chúng ta sẽ không sử dụng Datasets, DataApdater trong này, mà chỉ dùng các thành phần cơ bản như: Connection, Command, DataReader.
  

ADO.NET Mô Hình Kết Nối Với SQL Server - Phần 2.1.1


Như đã nói, với ADO.NET có hai mô hình sử dụng phổ biến là: Kết Nối & Phi Kết Nối. Hôm nay, chúng ta sẽ tìm hiểu phần mô hình kết Nối.

Phần 2: CÁCH THỨC SỬ DỤNG ADO.NET 


2.1 - Mô Hình Kết Nối
 

   Phần này, chúng ta sẽ tìm hiểu cách thức sử dụng ADO.NET trong mô hình kết nối CSDL. Điều đó có nghĩa, ứng dụng của bạn phải luôn kết nối tới CSDL để thực hiện các thao tác (Chọn, thêm, sửa xóa ...). Và hãy nhớ chúng ta sẽ không sử dụng Datasets, DataApdater trong này, mà chỉ dùng các thành phần cơ bản như: Connection, Command, DataReader.
  



Phần 1: GIỚI THIỆU


Trong phần đầu này chúng ta sẽ cùng nhau đi tìm hiểu công nghệ ADO.NET của Microsoft. Nội dung thì bao la nên chúng ta sẽ chỉ tìm hiểu sơ lược để cho bạn có thể nắm rõ chức năng cũng như cách thức sử dụng vào thực tế.


1.1. ADO.NET Là Gì ?


ActiveX Data Object.NET (ADO.NET) là một thư viện phần mềm .NET Framework. Bao gồm các thành phần phần mềm cung cấp dịch vụ truy cập dữ liệu. ADO.NET được thiết kế để cho phép các nhà phát triển viết mã được quản lý cho việc tiếp cận các nguồn dữ liệu bị ngắt kết nối, có thể có quan hệ hoặc không quan hệ (như XML hoặc dữ liệu ứng dụng). Tính năng này của ADO.NET giúp ứng dụng có thể chia sẻ dữ liệu hay các ứng dụng phân tán.

ADO.NET Cơ Bản - Phần 1


Phần 1: GIỚI THIỆU


Trong phần đầu này chúng ta sẽ cùng nhau đi tìm hiểu công nghệ ADO.NET của Microsoft. Nội dung thì bao la nên chúng ta sẽ chỉ tìm hiểu sơ lược để cho bạn có thể nắm rõ chức năng cũng như cách thức sử dụng vào thực tế.


1.1. ADO.NET Là Gì ?


ActiveX Data Object.NET (ADO.NET) là một thư viện phần mềm .NET Framework. Bao gồm các thành phần phần mềm cung cấp dịch vụ truy cập dữ liệu. ADO.NET được thiết kế để cho phép các nhà phát triển viết mã được quản lý cho việc tiếp cận các nguồn dữ liệu bị ngắt kết nối, có thể có quan hệ hoặc không quan hệ (như XML hoặc dữ liệu ứng dụng). Tính năng này của ADO.NET giúp ứng dụng có thể chia sẻ dữ liệu hay các ứng dụng phân tán.


MSDN ( The Microsoft Developer Network) giống như một thư viện lớn về lập trình trên các nền tảng được xây dựng bởi Microsoft. Để sử dụng nó, chúng ta thường truy cập vào website MSDN hoặc trong Visual Studio  Help -> View Help Ctrl + F1

Trong Visual Studio nếu bạn không tải về bộ MSDN offline thì khi không thể tra cứu khi thiếu vắng internet. Để sử dụng offline ta làm như sau:

B1: Mở Visual Studio 2012/2013 lên.

B2: Help -> Set Help Preference -> Lauch in Help Viewer

- Click vào đây chương trình sẽ yêu cầu được tải về

B3: Sau khi tải về Help Viewer hiện lên chọn tiếp Manage Content Ctrl + Shift + M

B4: Bảng Add and Remove content như dưới. Chọn radion button Online để tải về, chọn Local Store Path để đặt vị trí lưu.

B5: Sau khi add các nội dung bạn cần nhìn xuống góc dưới bên phải nhấn Update để tải về

Sau khi tải xong (hơi lâu) bạn có thể sử dụng trong Visual Studio. HELP -> View Help Ctrl + F1 khi máy không có internet để tra cứu thông tin.




Update: 20/12/2013

MSDN LOGO
Nguồn: Tự Học IT Online - http://tuhocit.net

Sử Dụng MSDN Offline Trên Visual Studio 2012/2013

MSDN ( The Microsoft Developer Network) giống như một thư viện lớn về lập trình trên các nền tảng được xây dựng bởi Microsoft. Để sử dụng nó, chúng ta thường truy cập vào website MSDN hoặc trong Visual Studio  Help -> View Help Ctrl + F1

Trong Visual Studio nếu bạn không tải về bộ MSDN offline thì khi không thể tra cứu khi thiếu vắng internet. Để sử dụng offline ta làm như sau:

B1: Mở Visual Studio 2012/2013 lên.

B2: Help -> Set Help Preference -> Lauch in Help Viewer

- Click vào đây chương trình sẽ yêu cầu được tải về

B3: Sau khi tải về Help Viewer hiện lên chọn tiếp Manage Content Ctrl + Shift + M

B4: Bảng Add and Remove content như dưới. Chọn radion button Online để tải về, chọn Local Store Path để đặt vị trí lưu.

B5: Sau khi add các nội dung bạn cần nhìn xuống góc dưới bên phải nhấn Update để tải về

Sau khi tải xong (hơi lâu) bạn có thể sử dụng trong Visual Studio. HELP -> View Help Ctrl + F1 khi máy không có internet để tra cứu thông tin.




Update: 20/12/2013

MSDN LOGO
Nguồn: Tự Học IT Online - http://tuhocit.net

Với ví dụ nhỏ này, mã nguồn được viết bằng C# bạn có thể sử dụng để chuyển đổi một dãy số tối đa 15 chữ số về dạng chữ. Giống như trong hóa đơn tiền . . . Và có thể build DLL để import vào project  để sử dụng khi cần thiết.

Đây là ví dụ đơn giản, tác giả đã chỉ dùng IF, TRUE, FALSE là các hàm chính để xác định nội dung cần chuyển đổi. Nếu bạn có ý tưởng hay hơn hãy chỉnh sửa nó

Trong đó bạn có thể hiểu một số cú pháp như sau:
if(a==0) return;

// Nếu như trong phương thức bạn viết như vậy thì ngay khi đọc được lệnh này nó sẽ kiểm tra xem a có bằng 0, nếu bằng 0 phương thức sẽ ngừng tại lệnh này và không đọc tiếp các lệnh sau nó. Hàm kiểu void thì bạn return; như vậy. Còn các kiểu int, string thì return về kiểu tương ứng.
int x =  a > b ? 5 : 7;

//Đây là một dạng điều kiện true/false trả về kết quả tương ứng. Như lệnh trên biến x = 5 nếu a > b là True và x = 7 nếu a > b là False. Bạn có thể lồng nhiều câu lệnh vào nhau và chú ý ngoặc ( )

Xem qua demo ứng dụng:









Chuyển Số Thành Chữ Bằng C#
Hình 1: Demo Chính

Trong ứng dụng, các công việc được chia nhỏ ra thành nhiều phương thức theo nhiệm vụ để gộp nên một phương thức tổng quát.




Tải Mẫu : Tại Đây

(Nếu source code bị lỗi không tải được xin hãy để lại lời nhắn tại đây)

Update:  15/11/2013
Nguồn: Tự Học IT Online - http://tuhocit.net

Chuyển Số Thành Chữ Bằng C#

Với ví dụ nhỏ này, mã nguồn được viết bằng C# bạn có thể sử dụng để chuyển đổi một dãy số tối đa 15 chữ số về dạng chữ. Giống như trong hóa đơn tiền . . . Và có thể build DLL để import vào project  để sử dụng khi cần thiết.

Đây là ví dụ đơn giản, tác giả đã chỉ dùng IF, TRUE, FALSE là các hàm chính để xác định nội dung cần chuyển đổi. Nếu bạn có ý tưởng hay hơn hãy chỉnh sửa nó

Trong đó bạn có thể hiểu một số cú pháp như sau:
if(a==0) return;

// Nếu như trong phương thức bạn viết như vậy thì ngay khi đọc được lệnh này nó sẽ kiểm tra xem a có bằng 0, nếu bằng 0 phương thức sẽ ngừng tại lệnh này và không đọc tiếp các lệnh sau nó. Hàm kiểu void thì bạn return; như vậy. Còn các kiểu int, string thì return về kiểu tương ứng.
int x =  a > b ? 5 : 7;

//Đây là một dạng điều kiện true/false trả về kết quả tương ứng. Như lệnh trên biến x = 5 nếu a > b là True và x = 7 nếu a > b là False. Bạn có thể lồng nhiều câu lệnh vào nhau và chú ý ngoặc ( )

Xem qua demo ứng dụng:









Chuyển Số Thành Chữ Bằng C#
Hình 1: Demo Chính

Trong ứng dụng, các công việc được chia nhỏ ra thành nhiều phương thức theo nhiệm vụ để gộp nên một phương thức tổng quát.




Tải Mẫu : Tại Đây

(Nếu source code bị lỗi không tải được xin hãy để lại lời nhắn tại đây)

Update:  15/11/2013
Nguồn: Tự Học IT Online - http://tuhocit.net

- DateTime là một struct xử lý ngày tháng rất mạnh mẽ nằm tại
Namesapce: System  
     Assembly:  mscorlib.dll
Và nó có tới 12 Constructor khác nhau đồng nghĩa có 12 cách truyền tham số khởi tạo đối tượng khác nhau. Cho bạn xử lý thời gian mạnh mẽ hơn kết hợp với các hàm và chúng ta sẽ tìm hiểu tiếp theo đây

 

 



Trong phần này chúng ta đi tìm hiểu các phương thức cộng ngày tháng, giờ, phút................... bằng cách cộng thêm Ngày, tháng, năm ....... mới vào  ngày xác định cho trước  để cho ra kết quả mới. Giá trị add mới có thể là âm / dương để lấy về một kết quả  tăng hoặc giảm như mong muốn.
Phương thức Add bao gồm:

- Add: Trả về ngày giờ mới có thể tăng hoặc giảm tùy thuộc vào tham số truyền vào hàm Timespan. Bạn có thể truyền giá trị âm vào TimeSpan để lấy giá trị giảm.
- AddYears: Trả về ngày tháng mới mà giá trị thay đổi là Năm. Bạn có thể nhận một giá trị tăng hoặc giảm tùy vào tham số truyền vào
- AddMonths: Trả về ngày giờ mới mà giá trị thay đổi là Tháng và Năm . . .
- AddDays: Trả về ngày  giờ mới mà giá trị thay đổi là Ngày, Tháng Năm . . .
- AddHours: Trả về ngày giờ mới mà giá trị thay đổi là Giờ, Ngày, Tháng Năm . . .
- AddMinutes: Trả về ngày giờ mới mà giá trị thay đổi là Phút, Giờ, Ngày, Tháng Năm . . .
- AddSeconds: Trả về ngày giờ mới mà giá trị thay đổi là Giây, Phút, Giờ, Ngày, Tháng Năm . . .
- AddMilliseconds: Tương tự như trên và thay đổi tới mức Mili giây . . .
- AddTicks: Trả vể ngày giờ mới và thay đổi tới mức siêu nhỏ (nanoseconds). Tham số truyền vào có giá trị gấp 100 lần nanoseconds
-------------------------------------------------------------------------------------------------------

Kiểu dữ liệu DateTime trong C# sẽ trả về ngày tháng dạng: 09/23/2013 01:00:00 AM

Dưới đây là các ký tự được dùng cho việc quy định hiển thị một phần giá trị của định dạng trên:
- y hiển thị tháng và năm dạng: Septemper 2013
- yy hiển thị 2 số cuối của năm: 13
- yyy hiển hị năm 3 số nếu năm 4 số thì tự chuyển qua: 2013
- yyyy hiển thị năm dạng 4 số: 2013
- M hiển thị tháng dạng chữ cái + ngày dạng số: Septemper 23
- MMM hiển thị tháng dưới dạng 3 chữ cái đầu tiên trong tên tháng: Sep
- MMMM hiển thị tháng dạng chữ cái đầy đủ: Septemper
- d hiển thị ngày tháng năm dạng: 23/09/2013
- dd hiển thị chỉ ngày dạng số: 23
- ddd hiển thị thứ của ngày dạng 3 chữ cái: Mon
- dddd hiển thị thứ của ngày dạng đầy đủ: Monday

- HH hiển thị giờ theo dạng 24h
- mm hiển thị phút dưới dạng 2 số
- ss hiển thị giây dạng 2 số
- tt hiển thị AM/PM  :            01:21:45:AM

- N Hiển thị dấu phẩy cho dãy số. Có thể tùy chỉnh N0, N1, N2 . . .


Tuy nhiên, chúng ta có cách khác ngoài việc dùng các ký tự trong lúc in ra ngày giờ bằng cách sau:
DateTime today= DateTime.Now;
int year = today.Year;
int month = today.Month;
int day = today.Day;
int hour = today.Hour;
int minute = today.Minute;
int second = today.Second;
int millisecond = today.Millisecond;

Các biến ở trên get ra Năm, Tháng, Ngày, Giờ . . . hiện tại của ngày đã cho
long tick = today.Ticks; 

Đối với biến tick mà chúng ta get ra được ở trên nó khác hoàn toàn với các biến trên nó, bởi vì tick này chính là tổng ngày tháng, giờ....tính ra dạng ticks. Cho độ chính xác cao, từ biến này ta có thể in ra các kết quả dạng
// 21,338,580,000,000,000 nanoseconds 
// 2,190,385,800,000,000 ticks 
// 219,333,580.00 seconds 
// 2,555,643.00 minutes 
//...................... hour, day, month, year

----------------------------------------------------------------------------------------------------------------
1. Add Method()
- Trả về ngày mới tăng hoặc giảm tuy vào quy định của giá trị truyền vào trong phương thức TimeSpan.  Times Span ở đây nó sẽ khởi tạo một ngày mới do ta cài đặt và nó có 5 cách sử dụng tức là có 5 cách truyền tham số (Parameter) vào nó.
Sau khi thiết lập ngày giờ cho TimesSpan thì gán vào phương thức Add() để xử lý ra ngày giờ mới. Và Add() chỉ nhận giá trị của TimeSpan. Bạn không thể gán giá DateTime vào nó.

- Ở ví dụ này, chúng ta sẽ truyền vào nó 4 tham số kiểu Int: Ngày, Giờ, Phút, Giây
    using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DateTimeDemo
{
class Program
{
static void Main(string[] args)
{
var today = DateTime.Now;
var duration = new TimeSpan(0, 0, 0, 0);
DateTime newday = today.Add(duration);

Console.WriteLine("{0}", newday);
/* Out: 9/23/2013 1:31:50:AM */
Console.WriteLine("{0:yyyy}", newday);
/* Out: 2013 */
Console.WriteLine("{0:MMMM}", newday);
/* Out: Septemper */
Console.WriteLine("{0:dd}", newday);
/* Out: 23 */
Console.WriteLine("{0:HH}", newday);
/* Out: 01 */
Console.WriteLine("{0:mm}", newday);
/* Out: 31 */
Console.WriteLine("{0:ss}", newday);
/* Out: 50 */
Console.WriteLine("{0:tt}", newday);
/* Out: AM */
Console.ReadLine();
}
}
}

 

2. AddYears()
- Tham số truyền vào là kiểu int và tất nhiên là có thể âm hoặc dương
DateTime today = DateTime.Now;
DateTime newday = today.AddYears(5);

Console.WriteLine(today);
Console.WriteLine(newday);
/*
* Output:
* today: 9/24/2013
* newday: 9/24/2018
*/

3. AddMonths()
- Tương tự tham số truyền vào là kiểu Int và có thể âm hoặc dương
DateTime today = DateTime.Now;
DateTime newday = today.AddMonths(15);

Console.WriteLine(today);
Console.WriteLine(newday);
/*
* Output:
* today: 9/24/2013
* newday: 12/24/2014
*/

4. AddDays()
- Trả về ngày mới tăng hoặc giảm tùy vào giá trị tham số truyền vào phương thức AddDays() . Giá trị truyền vào là kiểu Double quy định cho số ngày bạn cần Add là bao nhiêu và có thể âm hoặc dương.
DateTime today = DateTime.Now; //Get Date time now on system
DateTime newday = today.AddDays(6); // Adding 6 days from the current date
Console.WriteLine("Today: {0:d}", today);
Console.WriteLine("6 days from today: {0:d}", newday);

/* Output
* Today: 9/23/2013
* 6 days from today: 9/29/2013
*/

5. AddHours()
- Trả về ngày mới tăng hoặc giảm tùy thuộc vào tham số truyền vào phương thức AddHours(). Giá trị truyền vào là kiểu Double   quy định cho số giờ bạn cần Add là bao nhiêu và có thể âm hoặc dương.
DateTime today = DateTime.Now;
DateTime newday = today.AddHours(-4);
Console.WriteLine("{0}",newday);

/* Today: 9/24/2013 2:30: PM
* Output
* newday: 9/24/2013 10:30: AM
*/

6. AddMinutes()
- Tương tự như AddHour. Trả về ngày mới tùy thuộc vào tham số truyền vào hàm AddMinutes(). Giá trị truyền vào là kiểu Double quy định cho số phút bạn Add vào
DateTime today = DateTime.Now;
DateTime newday = today.AddMinutes(60);
Console.WriteLine("{0}",newday);

/* Today: 9/24/2013 2:30: PM
* Output
* newday: 9/24/2013 3:30: PM
*/

7. AddSeconds()
Tương tự, tham số truyền vào là kiểu Double

DateTime today = DateTime.Now;
DateTime newday = today.AddSeconds(3600); // 3600s = 60 minutes
Console.WriteLine("{0}",newday);

/* Today: 9/24/2013 2:30: PM
* Output
* newday: 9/24/2013 3:30: PM
*/

 
8. AddMilliseconds()
Tương tự, tham số truyền vào là kiểu Double
DateTime today = DateTime.Now;
DateTime newday = today.AddMilliseconds(1000); // 1000 Milliseconds = 1 Seconds
Console.WriteLine("{0}", today);
Console.WriteLine("{0}", newday);
/*
* Output
* today: 9/24/2013 2:30:40 PM
* newday: 9/24/2013 3:30:41 PM
*/

9. AddTicks()
Tham số truyền vào là kiểu long 64bit

- Nanosecond là đơn vị thời gian cực nhỏ với:






1 nanosecond = 1.0 x 10-9 Seconds

Trong C# chúng ta sử dụng hàm AddTicks để tính phép công có giá trị thời gian nhỏ cỡ nano nhưng:
1 ticks = 100 nanosecond

Demo 1:


DateTime today = DateTime.Now;
DateTime newday = today.AddTicks(10000000);
/*
* 1 Seconds = 1000.000.000 nanoseconds
* 1 Seconds = 10.000.000 Ticks
* 1 Ticks = 100 nanoseconds
*/
Console.WriteLine("{0}", today);
Console.WriteLine("{0}", newday);
/*
* Output
* today: 9/24/2013 2:30:40 PM
* newday: 9/24/2013 2:30:41 PM
*/

 Demo 2: Ví dụ chuyển ngày tháng cụ thể sang dạng Ticks và sử dụng biến này in ra các dạng khác nhau của ngày tháng
DateTime today = DateTime.Now;
long varTick = today.Ticks;
TimeSpan ts = new TimeSpan(varTick);

Console.WriteLine("Today is: {0:f}",today);
Console.WriteLine(" {0:N0} nanoseconds", varTick * 100);
Console.WriteLine(" {0:N0} ticks", varTick);
Console.WriteLine(" {0:N2} seconds", ts.TotalSeconds);
Console.WriteLine(" {0:N2} minutes", ts.TotalMinutes);
Console.WriteLine(" {0:N0} days, {1} hours, {2} minutes, {3} seconds",
ts.Days, ts.Hours,
ts.Minutes, ts.Seconds);

 





Demo:
To be continued . . .
Nguồn: Tự Học IT Online - http://tuhocit.net

Xử lý DateTime trong C# - Phần 1

- DateTime là một struct xử lý ngày tháng rất mạnh mẽ nằm tại
Namesapce: System  
     Assembly:  mscorlib.dll
Và nó có tới 12 Constructor khác nhau đồng nghĩa có 12 cách truyền tham số khởi tạo đối tượng khác nhau. Cho bạn xử lý thời gian mạnh mẽ hơn kết hợp với các hàm và chúng ta sẽ tìm hiểu tiếp theo đây

 

 



Trong phần này chúng ta đi tìm hiểu các phương thức cộng ngày tháng, giờ, phút................... bằng cách cộng thêm Ngày, tháng, năm ....... mới vào  ngày xác định cho trước  để cho ra kết quả mới. Giá trị add mới có thể là âm / dương để lấy về một kết quả  tăng hoặc giảm như mong muốn.
Phương thức Add bao gồm:

- Add: Trả về ngày giờ mới có thể tăng hoặc giảm tùy thuộc vào tham số truyền vào hàm Timespan. Bạn có thể truyền giá trị âm vào TimeSpan để lấy giá trị giảm.
- AddYears: Trả về ngày tháng mới mà giá trị thay đổi là Năm. Bạn có thể nhận một giá trị tăng hoặc giảm tùy vào tham số truyền vào
- AddMonths: Trả về ngày giờ mới mà giá trị thay đổi là Tháng và Năm . . .
- AddDays: Trả về ngày  giờ mới mà giá trị thay đổi là Ngày, Tháng Năm . . .
- AddHours: Trả về ngày giờ mới mà giá trị thay đổi là Giờ, Ngày, Tháng Năm . . .
- AddMinutes: Trả về ngày giờ mới mà giá trị thay đổi là Phút, Giờ, Ngày, Tháng Năm . . .
- AddSeconds: Trả về ngày giờ mới mà giá trị thay đổi là Giây, Phút, Giờ, Ngày, Tháng Năm . . .
- AddMilliseconds: Tương tự như trên và thay đổi tới mức Mili giây . . .
- AddTicks: Trả vể ngày giờ mới và thay đổi tới mức siêu nhỏ (nanoseconds). Tham số truyền vào có giá trị gấp 100 lần nanoseconds
-------------------------------------------------------------------------------------------------------

Kiểu dữ liệu DateTime trong C# sẽ trả về ngày tháng dạng: 09/23/2013 01:00:00 AM

Dưới đây là các ký tự được dùng cho việc quy định hiển thị một phần giá trị của định dạng trên:
- y hiển thị tháng và năm dạng: Septemper 2013
- yy hiển thị 2 số cuối của năm: 13
- yyy hiển hị năm 3 số nếu năm 4 số thì tự chuyển qua: 2013
- yyyy hiển thị năm dạng 4 số: 2013
- M hiển thị tháng dạng chữ cái + ngày dạng số: Septemper 23
- MMM hiển thị tháng dưới dạng 3 chữ cái đầu tiên trong tên tháng: Sep
- MMMM hiển thị tháng dạng chữ cái đầy đủ: Septemper
- d hiển thị ngày tháng năm dạng: 23/09/2013
- dd hiển thị chỉ ngày dạng số: 23
- ddd hiển thị thứ của ngày dạng 3 chữ cái: Mon
- dddd hiển thị thứ của ngày dạng đầy đủ: Monday

- HH hiển thị giờ theo dạng 24h
- mm hiển thị phút dưới dạng 2 số
- ss hiển thị giây dạng 2 số
- tt hiển thị AM/PM  :            01:21:45:AM

- N Hiển thị dấu phẩy cho dãy số. Có thể tùy chỉnh N0, N1, N2 . . .


Tuy nhiên, chúng ta có cách khác ngoài việc dùng các ký tự trong lúc in ra ngày giờ bằng cách sau:
DateTime today= DateTime.Now;
int year = today.Year;
int month = today.Month;
int day = today.Day;
int hour = today.Hour;
int minute = today.Minute;
int second = today.Second;
int millisecond = today.Millisecond;

Các biến ở trên get ra Năm, Tháng, Ngày, Giờ . . . hiện tại của ngày đã cho
long tick = today.Ticks; 

Đối với biến tick mà chúng ta get ra được ở trên nó khác hoàn toàn với các biến trên nó, bởi vì tick này chính là tổng ngày tháng, giờ....tính ra dạng ticks. Cho độ chính xác cao, từ biến này ta có thể in ra các kết quả dạng
// 21,338,580,000,000,000 nanoseconds 
// 2,190,385,800,000,000 ticks 
// 219,333,580.00 seconds 
// 2,555,643.00 minutes 
//...................... hour, day, month, year

----------------------------------------------------------------------------------------------------------------
1. Add Method()
- Trả về ngày mới tăng hoặc giảm tuy vào quy định của giá trị truyền vào trong phương thức TimeSpan.  Times Span ở đây nó sẽ khởi tạo một ngày mới do ta cài đặt và nó có 5 cách sử dụng tức là có 5 cách truyền tham số (Parameter) vào nó.
Sau khi thiết lập ngày giờ cho TimesSpan thì gán vào phương thức Add() để xử lý ra ngày giờ mới. Và Add() chỉ nhận giá trị của TimeSpan. Bạn không thể gán giá DateTime vào nó.

- Ở ví dụ này, chúng ta sẽ truyền vào nó 4 tham số kiểu Int: Ngày, Giờ, Phút, Giây
    using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DateTimeDemo
{
class Program
{
static void Main(string[] args)
{
var today = DateTime.Now;
var duration = new TimeSpan(0, 0, 0, 0);
DateTime newday = today.Add(duration);

Console.WriteLine("{0}", newday);
/* Out: 9/23/2013 1:31:50:AM */
Console.WriteLine("{0:yyyy}", newday);
/* Out: 2013 */
Console.WriteLine("{0:MMMM}", newday);
/* Out: Septemper */
Console.WriteLine("{0:dd}", newday);
/* Out: 23 */
Console.WriteLine("{0:HH}", newday);
/* Out: 01 */
Console.WriteLine("{0:mm}", newday);
/* Out: 31 */
Console.WriteLine("{0:ss}", newday);
/* Out: 50 */
Console.WriteLine("{0:tt}", newday);
/* Out: AM */
Console.ReadLine();
}
}
}

 

2. AddYears()
- Tham số truyền vào là kiểu int và tất nhiên là có thể âm hoặc dương
DateTime today = DateTime.Now;
DateTime newday = today.AddYears(5);

Console.WriteLine(today);
Console.WriteLine(newday);
/*
* Output:
* today: 9/24/2013
* newday: 9/24/2018
*/

3. AddMonths()
- Tương tự tham số truyền vào là kiểu Int và có thể âm hoặc dương
DateTime today = DateTime.Now;
DateTime newday = today.AddMonths(15);

Console.WriteLine(today);
Console.WriteLine(newday);
/*
* Output:
* today: 9/24/2013
* newday: 12/24/2014
*/

4. AddDays()
- Trả về ngày mới tăng hoặc giảm tùy vào giá trị tham số truyền vào phương thức AddDays() . Giá trị truyền vào là kiểu Double quy định cho số ngày bạn cần Add là bao nhiêu và có thể âm hoặc dương.
DateTime today = DateTime.Now; //Get Date time now on system
DateTime newday = today.AddDays(6); // Adding 6 days from the current date
Console.WriteLine("Today: {0:d}", today);
Console.WriteLine("6 days from today: {0:d}", newday);

/* Output
* Today: 9/23/2013
* 6 days from today: 9/29/2013
*/

5. AddHours()
- Trả về ngày mới tăng hoặc giảm tùy thuộc vào tham số truyền vào phương thức AddHours(). Giá trị truyền vào là kiểu Double   quy định cho số giờ bạn cần Add là bao nhiêu và có thể âm hoặc dương.
DateTime today = DateTime.Now;
DateTime newday = today.AddHours(-4);
Console.WriteLine("{0}",newday);

/* Today: 9/24/2013 2:30: PM
* Output
* newday: 9/24/2013 10:30: AM
*/

6. AddMinutes()
- Tương tự như AddHour. Trả về ngày mới tùy thuộc vào tham số truyền vào hàm AddMinutes(). Giá trị truyền vào là kiểu Double quy định cho số phút bạn Add vào
DateTime today = DateTime.Now;
DateTime newday = today.AddMinutes(60);
Console.WriteLine("{0}",newday);

/* Today: 9/24/2013 2:30: PM
* Output
* newday: 9/24/2013 3:30: PM
*/

7. AddSeconds()
Tương tự, tham số truyền vào là kiểu Double

DateTime today = DateTime.Now;
DateTime newday = today.AddSeconds(3600); // 3600s = 60 minutes
Console.WriteLine("{0}",newday);

/* Today: 9/24/2013 2:30: PM
* Output
* newday: 9/24/2013 3:30: PM
*/

 
8. AddMilliseconds()
Tương tự, tham số truyền vào là kiểu Double
DateTime today = DateTime.Now;
DateTime newday = today.AddMilliseconds(1000); // 1000 Milliseconds = 1 Seconds
Console.WriteLine("{0}", today);
Console.WriteLine("{0}", newday);
/*
* Output
* today: 9/24/2013 2:30:40 PM
* newday: 9/24/2013 3:30:41 PM
*/

9. AddTicks()
Tham số truyền vào là kiểu long 64bit

- Nanosecond là đơn vị thời gian cực nhỏ với:






1 nanosecond = 1.0 x 10-9 Seconds

Trong C# chúng ta sử dụng hàm AddTicks để tính phép công có giá trị thời gian nhỏ cỡ nano nhưng:
1 ticks = 100 nanosecond

Demo 1:


DateTime today = DateTime.Now;
DateTime newday = today.AddTicks(10000000);
/*
* 1 Seconds = 1000.000.000 nanoseconds
* 1 Seconds = 10.000.000 Ticks
* 1 Ticks = 100 nanoseconds
*/
Console.WriteLine("{0}", today);
Console.WriteLine("{0}", newday);
/*
* Output
* today: 9/24/2013 2:30:40 PM
* newday: 9/24/2013 2:30:41 PM
*/

 Demo 2: Ví dụ chuyển ngày tháng cụ thể sang dạng Ticks và sử dụng biến này in ra các dạng khác nhau của ngày tháng
DateTime today = DateTime.Now;
long varTick = today.Ticks;
TimeSpan ts = new TimeSpan(varTick);

Console.WriteLine("Today is: {0:f}",today);
Console.WriteLine(" {0:N0} nanoseconds", varTick * 100);
Console.WriteLine(" {0:N0} ticks", varTick);
Console.WriteLine(" {0:N2} seconds", ts.TotalSeconds);
Console.WriteLine(" {0:N2} minutes", ts.TotalMinutes);
Console.WriteLine(" {0:N0} days, {1} hours, {2} minutes, {3} seconds",
ts.Days, ts.Hours,
ts.Minutes, ts.Seconds);

 





Demo:
To be continued . . .
Nguồn: Tự Học IT Online - http://tuhocit.net

Inheritance : tính kế thừa.

 

Polymorphism : tính đa hình

Encapsulation : tính đóng gói.





Đây là ba đặc điểm chính của lập trình hướng đối tượng và đây là nội dung chính chúng ta cần quan tâm. Các bài trước là tiền đề để ta nắm rõ các phương pháp này, tuy nhiên vẫn còn thiếu sót một vài vấn đề mà trong bài này sẽ bổ sung tiếp cho các bạn.

A. Tính Thừa Kế

Thừa kế ở đây là gì ? Là sự kế thừa, tái sử dụng phương thức, thuộc tính của lớp cơ sở. Và lớp kế thừa được gọi là lớp con, nó sẽ thừa hưởng những gì lớp cha có và cho phép. Kế thừa giúp tiết kiệm thời gian viết code, tái sử dụng và mở rộng hiệu quả, dễ bảo trì sửa chữa. Có 2 loại thừa kế, đó là đa thừa kế và đơn thừa kế. Trong các ngôn ngữ hướng đối tượng như C#,Java . . . thì không hỗ trợ đa thừa kế. (C++ có hỗ trợ đa thừa kế).

- Đa thừa kế là một lớp con có thể kế thừa từ hai hoặc nhiều lớp cha (lớp cơ sở). Nó mang lại sự phức tạp, trùng lặp không đáng có . . .Chúng ta không tìm hiểu thêm tại đây
- Đơn thừa kế là một lớp con chỉ kế thừa từ một lớp cha. Và tất nhiên một lớp cha có thể có nhiều lớp con kế thừa từ nó và lớp con đó có thể là lớp cha của lớp khác.
- Trong kế thừa nếu Class B kế thừa từ Class A và Class C kế thừa từ Class B. Thì Class C được thừa hưởng các thuộc tính phương thức (cho phép) của A và B.

Trong C# ta dùng dấu hai chấm ':' để kế thừa class khác.
Cách gọi :
Lớp cha (lớp cơ sở) - Base class
Lớp con (lớp dẫn xuất) - Derived class

Xem ví dụ dưới






- Từ hình trên bạn có thể thấy, chúng ta có 2 interface. Và class A kế thừa cùng lúc cả 2 interface này, bên dưới class B kế thừa A tương tự ta có class C kế thừa B.
- Hình mũi tên màu đen miêu tả sự kế thừa của các class.
Màu đỏ miều tả class C được thừa hưởng từ A và B.
Màu xanh  miêu tả class B vẫn có thể thể hiện các interface do class A kế thừa. Nếu class A không thực thi các interface này mà nhường cho lớp B của nó bằng cách sử dụng abstract.

Interface

- Nó giống như abstract class. Bất kỳ một class nào kế thừa phải thực thi các method của nó.
- Một class có thể kế thừa cùng lúc nhiều interface
- Cú pháp của nó chỉ đơn giản là các method trống giống abstract vậy
- Cùng xem các ví dụ để hiểu rõ hơn nhé !


B. Tính Đa Hình

Tính đa hình cho phép các chức năng (method) khác nhau được thực thi khác nhau trên các đối tượng khác nhau. Nói nôm na đơn giản hơn là bạn có 3 lớp A,B,C kế thừa nhau và trong 3 lớp này có ba method cùng tên là show(); . Khi ta tạo mới đối tượng cho các lớp trên thì những đối tượng này gọi tới method show() nằm ở lớp nào thì thực thi chức năng phương thức ở lớp đó. Bởi vì chúng kế thừa nên sử dụng rõ tính đa hình này.

Cụ thể ta có đa hình tĩnh và đa hình động.

1. Đa hình tĩnh là việc dùng Overloading gồm các phương thức có trùng tên trong một class. Nhưng các phương thức này được thực thi khác nhau, tùy vào cài đặt. Bạn xem lại bài trước . . . Ở đây chúng ta không đề cập tới nữa

2. Đa hình động lại gồm có Abstract và Virtual. Trong đó abstract bạn có thể xem lại bài trước, chúng ta sẽ nói rõ về phương thức Virtual.

Thực ra virtual cũng giống như abstract, điểm khác biệt là bạn có thể viết các tuyên bố lệnh cho nó còn abstract method thì không. Và khi sử dụng phương thức abstract thì class đó cũng là abstract class còn Virtual thì không.

// Virtual method
public virtual void abc()
{
// Do something here !
}

// Abstract method
public abstract void abc();



Giả sử ta có lớp con kế thừa từ lớp cha chứa 2 phương thức virtual abstract. Thì lớp con này buộc phải triển khai lớp abstract từ lớp cha. Nhưng đối với phương thức virtual lớp con có thể sử dụng hoặc không. Một điểm chung đó là khi triển khai cả hai phương thức này ở lớp con chúng ta cần phải override chúng.

Vậy từ nãy giờ lang man mà cụ thể đa hình là sao, hoạt động như thế nào ?

Từ hình trên ta thấy rằng lớp B và C đã triển khai phương thức Abstract từ A (là bắt buộc). Tuy nhiên B triển khai tiếp phương thức Virtual của A mà C lại không (Vì không bắt buộc).
Giờ ta để ý p.thức virtual mà B tái sử dụng có từ khóa base, từ này ở đây có tác dụng gọi lại chức năng phương thức gốc của lớp A. Bạn có thể bỏ đi nếu không cần thiết và thay thế mã mới theo yêu cầu cài đặt.

Tại hàm Main khởi tạo đối tượng (Object) mới cho class B và C. Bạn có thể khởi tạo đối tượng bằng lệnh:  classB obj = new classB();
Sau đó thực thi 3 phương thức ta có kết quả như hình trên.
Lưu ý: Abstract class A không thể khởi tạo đối tượng vì nó là abstract.

C. Tính Đóng Gói

Đơn giản là việc sử dụng các  Access Modifiers để che dấu và bảo vệ thông tin cho các trường dữ liệu hoặc phương thức. Xem lại bài trước về access modifiers. Việc sử dụng thuần thục nó là rất quan trọng, vì nếu các thông tin về dữ liệu không được bảo vệ cẩn thận thì sẽ để lại lỗ hổng rất đáng lo ngại.

-----------------------------------------------------------------------
Dưới đây là mã nguồn demo các bạn tải về để xem nhé !



Chú ý:

Demo được thực hiện bằng VS Studio 2012. Nếu bạn dùng phiên bản thấp hơn, chẳng hạn 2010 thì làm như sau:

B1: Mở file *.sln bằng Notepad
B2: Bạn sẽ thấy những dòng đầu như thế này
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2012
Project("{FAE04EC0-301F-11 .........
...................................

B3: Thay số 12.00 in đậm thành 11.00 và 2012 thành 2010.
B4: Save
Hope this helps !


:hi:

BavoHex
Nguồn: Tự Học IT Online - http://tuhocit.net

OOP: Tính Kế Thừa - Tính Đa Hình - Tính Đóng Gói

Inheritance : tính kế thừa.

 

Polymorphism : tính đa hình

Encapsulation : tính đóng gói.





Đây là ba đặc điểm chính của lập trình hướng đối tượng và đây là nội dung chính chúng ta cần quan tâm. Các bài trước là tiền đề để ta nắm rõ các phương pháp này, tuy nhiên vẫn còn thiếu sót một vài vấn đề mà trong bài này sẽ bổ sung tiếp cho các bạn.

A. Tính Thừa Kế

Thừa kế ở đây là gì ? Là sự kế thừa, tái sử dụng phương thức, thuộc tính của lớp cơ sở. Và lớp kế thừa được gọi là lớp con, nó sẽ thừa hưởng những gì lớp cha có và cho phép. Kế thừa giúp tiết kiệm thời gian viết code, tái sử dụng và mở rộng hiệu quả, dễ bảo trì sửa chữa. Có 2 loại thừa kế, đó là đa thừa kế và đơn thừa kế. Trong các ngôn ngữ hướng đối tượng như C#,Java . . . thì không hỗ trợ đa thừa kế. (C++ có hỗ trợ đa thừa kế).

- Đa thừa kế là một lớp con có thể kế thừa từ hai hoặc nhiều lớp cha (lớp cơ sở). Nó mang lại sự phức tạp, trùng lặp không đáng có . . .Chúng ta không tìm hiểu thêm tại đây
- Đơn thừa kế là một lớp con chỉ kế thừa từ một lớp cha. Và tất nhiên một lớp cha có thể có nhiều lớp con kế thừa từ nó và lớp con đó có thể là lớp cha của lớp khác.
- Trong kế thừa nếu Class B kế thừa từ Class A và Class C kế thừa từ Class B. Thì Class C được thừa hưởng các thuộc tính phương thức (cho phép) của A và B.

Trong C# ta dùng dấu hai chấm ':' để kế thừa class khác.
Cách gọi :
Lớp cha (lớp cơ sở) - Base class
Lớp con (lớp dẫn xuất) - Derived class

Xem ví dụ dưới






- Từ hình trên bạn có thể thấy, chúng ta có 2 interface. Và class A kế thừa cùng lúc cả 2 interface này, bên dưới class B kế thừa A tương tự ta có class C kế thừa B.
- Hình mũi tên màu đen miêu tả sự kế thừa của các class.
Màu đỏ miều tả class C được thừa hưởng từ A và B.
Màu xanh  miêu tả class B vẫn có thể thể hiện các interface do class A kế thừa. Nếu class A không thực thi các interface này mà nhường cho lớp B của nó bằng cách sử dụng abstract.

Interface

- Nó giống như abstract class. Bất kỳ một class nào kế thừa phải thực thi các method của nó.
- Một class có thể kế thừa cùng lúc nhiều interface
- Cú pháp của nó chỉ đơn giản là các method trống giống abstract vậy
- Cùng xem các ví dụ để hiểu rõ hơn nhé !


B. Tính Đa Hình

Tính đa hình cho phép các chức năng (method) khác nhau được thực thi khác nhau trên các đối tượng khác nhau. Nói nôm na đơn giản hơn là bạn có 3 lớp A,B,C kế thừa nhau và trong 3 lớp này có ba method cùng tên là show(); . Khi ta tạo mới đối tượng cho các lớp trên thì những đối tượng này gọi tới method show() nằm ở lớp nào thì thực thi chức năng phương thức ở lớp đó. Bởi vì chúng kế thừa nên sử dụng rõ tính đa hình này.

Cụ thể ta có đa hình tĩnh và đa hình động.

1. Đa hình tĩnh là việc dùng Overloading gồm các phương thức có trùng tên trong một class. Nhưng các phương thức này được thực thi khác nhau, tùy vào cài đặt. Bạn xem lại bài trước . . . Ở đây chúng ta không đề cập tới nữa

2. Đa hình động lại gồm có Abstract và Virtual. Trong đó abstract bạn có thể xem lại bài trước, chúng ta sẽ nói rõ về phương thức Virtual.

Thực ra virtual cũng giống như abstract, điểm khác biệt là bạn có thể viết các tuyên bố lệnh cho nó còn abstract method thì không. Và khi sử dụng phương thức abstract thì class đó cũng là abstract class còn Virtual thì không.

// Virtual method
public virtual void abc()
{
// Do something here !
}

// Abstract method
public abstract void abc();



Giả sử ta có lớp con kế thừa từ lớp cha chứa 2 phương thức virtual abstract. Thì lớp con này buộc phải triển khai lớp abstract từ lớp cha. Nhưng đối với phương thức virtual lớp con có thể sử dụng hoặc không. Một điểm chung đó là khi triển khai cả hai phương thức này ở lớp con chúng ta cần phải override chúng.

Vậy từ nãy giờ lang man mà cụ thể đa hình là sao, hoạt động như thế nào ?

Từ hình trên ta thấy rằng lớp B và C đã triển khai phương thức Abstract từ A (là bắt buộc). Tuy nhiên B triển khai tiếp phương thức Virtual của A mà C lại không (Vì không bắt buộc).
Giờ ta để ý p.thức virtual mà B tái sử dụng có từ khóa base, từ này ở đây có tác dụng gọi lại chức năng phương thức gốc của lớp A. Bạn có thể bỏ đi nếu không cần thiết và thay thế mã mới theo yêu cầu cài đặt.

Tại hàm Main khởi tạo đối tượng (Object) mới cho class B và C. Bạn có thể khởi tạo đối tượng bằng lệnh:  classB obj = new classB();
Sau đó thực thi 3 phương thức ta có kết quả như hình trên.
Lưu ý: Abstract class A không thể khởi tạo đối tượng vì nó là abstract.

C. Tính Đóng Gói

Đơn giản là việc sử dụng các  Access Modifiers để che dấu và bảo vệ thông tin cho các trường dữ liệu hoặc phương thức. Xem lại bài trước về access modifiers. Việc sử dụng thuần thục nó là rất quan trọng, vì nếu các thông tin về dữ liệu không được bảo vệ cẩn thận thì sẽ để lại lỗ hổng rất đáng lo ngại.

-----------------------------------------------------------------------
Dưới đây là mã nguồn demo các bạn tải về để xem nhé !



Chú ý:

Demo được thực hiện bằng VS Studio 2012. Nếu bạn dùng phiên bản thấp hơn, chẳng hạn 2010 thì làm như sau:

B1: Mở file *.sln bằng Notepad
B2: Bạn sẽ thấy những dòng đầu như thế này
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2012
Project("{FAE04EC0-301F-11 .........
...................................

B3: Thay số 12.00 in đậm thành 11.00 và 2012 thành 2010.
B4: Save
Hope this helps !


:hi:

BavoHex
Nguồn: Tự Học IT Online - http://tuhocit.net

A. Constructor

Được gọi là hàm tạo, có hai loại hàm tạo :
- Hàm tạo không có tham số
- Hàm tạo có tham số truyền vào.
Khi bạn sử dụng hàm tạo, nó sẽ tạo các giá trị cho các trường thuộc tính của đối tượng mới được triển khai.
 public class Bird
{
//Field
protected string name;
protected float weight;
protected string color;

public Bird()
{
this.Name = "Bird ABCDF";
this.Weight = 20;
this.Color = "Green";
}
public Bird(string name, float weight, string color)
{
this.Name = name;
this.Weight = weight;
this.Color = color;
}
..................
...................
....................

Vậy ta dùng những hàm tạo này như thế nào ? Chúng ta qua hàm Main để test thử nhé.
class Program
{
static void Main(string[] args)
{

// Default
var Bird1 = new Bird();
Bird1.Name = "Bird ABC";
Bird1.Weight = 10;
Bird1.Color = "Red";
Bird1.printInfo();

// Using constructor with parameter
var Bird2 = new Bird("Bird ABCD", 15, "Blue");
Bird2.printInfo();

// using constructor without parameter.
var Bird3 = new Bird();
Bird3.printInfo();

Console.ReadLine();

}
}

Có thể thấy với Constructor rỗng tùy bạn nhập giá trị. Nếu sử dụng Constructor với tham số quy định, bạn phải đáp ứng đúng và đủ cho nó.

Như vậy !

Hàm tạo là một hàm đặc biệt cho phép ta thực thi chương trình ngay khi khởi động đối tượng mới. Lưu ý là một Constructor có tên trùng với tên class và không có giá trị trả lại kiểu : void, string, int , float . . . . Và luôn cho phép điều khiển truy xuất Public.
Ở bài sau chúng ta sẽ tìm hiểu từ khóa điều khiển truy xuất là gì !


B. Destructor

Được gọi là hàm hủy, trong ví dụ dưới bạn cần thêm lệnh cho hàm hủy.
class Bird
{
~Bird() // destructor
{
// cleanup statements...
}
}

Sau khi ta khai báo hàm hủy này, nó sẽ được tự động gọi trên các class cở sở của đối tượng. Và nó sẽ gọi ngầm lệnh như sau.
protected override void Finalize()
{
try
{
// Cleanup statements...
}
finally
{
base.Finalize();
}
}

 

Lưu ý !

- Hàm hủy được tự động gọi khi kết thúc chương trình để giải phóng tài nguyên không được kiểm soát.

- Trong thực tế ta rất ít khi cần sử dụng hàm này, vì chỉ sử dụng nếu có tài nguyên không thể kiểm soát. Và thường liên quan đến hệ thống,tập tin, kết nối mạng . . .

- Không nên tạo một hàm hủy RỖNG. Nếu vậy nó vẫn tự gọi Finalize () và điều đó làm giảm hiệu suất khi không có tác dụng gì.

- Không thể định nghĩa hàm này trong một struct mà chỉ sử dụng ở class. Một class chỉ tạo được một hàm hủy mà thôi.

- Hàm hủy không có tham số truyền vào.


C. Overloading Method
- Hay còn được gọi là nạp chồng phương thức. Có thể hiểu đơn giản là ta có thể triển khai 2 hay nhiều phương thức (method) mà nó trùng tên trong cùng một class.


using System;

namespace TestClassOOP
{

class People
{

void methodOverloading()
{
Console.WriteLine("Hello !");
}

void methodOverloading(string world)
{
Console.WriteLine(world);
}

int methodOverloading(int a)
{
return a;
}

float methodOverloading(int a, int b)
{
return a * b;
}
}
}

Ta thử gọi những hàm này để dùng xem sao nhé:



Lúc này bạn sẽ tháy có 4 lựa chọn cho bạn, tương ứng với 4 hàm mà bạn đã tạo ở trên.




Chúng ta có thể dễ dàng phân biệt các hàm dựa vào tham số truyền vào của chúng.


- Khi bạn sử dụng Overloading thì không được phép tạo cùng lúc 2 hàm mà tham số truyền vào là giống nhau, xét về mặt vị trí. Hai hàm có tham số đầu vào rỗng cũng là có cùng tham số và không hợp lệ. Nếu giống nhau mà khác vị trí thì hợp lệ. Ở đây ta không xét type của nó (void, string, int, float ...). Hai hàm float và string cùng trùng tham số và vị trí đều không hợp lệ.





Như vậy !

Ở C# khi sử dụng các hàm trùng tên trong một lớp thì đó chính là Overloading. Ưu điểm của cách dùng này giúp bạn giảm thiểu đặt tên cho các phương thức chung hình thức mà vẫn biết được mình cần dùng gì


abstract public  class People
{
abstract public void methodOverloading();

abstract public void methodOverloading(string world);

abstract public int methodOverloading(int a);

abstract public float methodOverloading(int a, int b);
}

Bạn có thể dùng nó cho lớp cha để cho các lớp con kế thừa hoặc dùng với abstract để lớp con triển khai đều được. Và chúng ta sẽ đi tiếp hiểu trong bài sau . . . ;))
Nguồn: Tự Học IT Online - http://tuhocit.net

OOP: Constructor - Destructor - Overloading [C#]

A. Constructor

Được gọi là hàm tạo, có hai loại hàm tạo :
- Hàm tạo không có tham số
- Hàm tạo có tham số truyền vào.
Khi bạn sử dụng hàm tạo, nó sẽ tạo các giá trị cho các trường thuộc tính của đối tượng mới được triển khai.
 public class Bird
{
//Field
protected string name;
protected float weight;
protected string color;

public Bird()
{
this.Name = "Bird ABCDF";
this.Weight = 20;
this.Color = "Green";
}
public Bird(string name, float weight, string color)
{
this.Name = name;
this.Weight = weight;
this.Color = color;
}
..................
...................
....................

Vậy ta dùng những hàm tạo này như thế nào ? Chúng ta qua hàm Main để test thử nhé.
class Program
{
static void Main(string[] args)
{

// Default
var Bird1 = new Bird();
Bird1.Name = "Bird ABC";
Bird1.Weight = 10;
Bird1.Color = "Red";
Bird1.printInfo();

// Using constructor with parameter
var Bird2 = new Bird("Bird ABCD", 15, "Blue");
Bird2.printInfo();

// using constructor without parameter.
var Bird3 = new Bird();
Bird3.printInfo();

Console.ReadLine();

}
}

Có thể thấy với Constructor rỗng tùy bạn nhập giá trị. Nếu sử dụng Constructor với tham số quy định, bạn phải đáp ứng đúng và đủ cho nó.

Như vậy !

Hàm tạo là một hàm đặc biệt cho phép ta thực thi chương trình ngay khi khởi động đối tượng mới. Lưu ý là một Constructor có tên trùng với tên class và không có giá trị trả lại kiểu : void, string, int , float . . . . Và luôn cho phép điều khiển truy xuất Public.
Ở bài sau chúng ta sẽ tìm hiểu từ khóa điều khiển truy xuất là gì !


B. Destructor

Được gọi là hàm hủy, trong ví dụ dưới bạn cần thêm lệnh cho hàm hủy.
class Bird
{
~Bird() // destructor
{
// cleanup statements...
}
}

Sau khi ta khai báo hàm hủy này, nó sẽ được tự động gọi trên các class cở sở của đối tượng. Và nó sẽ gọi ngầm lệnh như sau.
protected override void Finalize()
{
try
{
// Cleanup statements...
}
finally
{
base.Finalize();
}
}

 

Lưu ý !

- Hàm hủy được tự động gọi khi kết thúc chương trình để giải phóng tài nguyên không được kiểm soát.

- Trong thực tế ta rất ít khi cần sử dụng hàm này, vì chỉ sử dụng nếu có tài nguyên không thể kiểm soát. Và thường liên quan đến hệ thống,tập tin, kết nối mạng . . .

- Không nên tạo một hàm hủy RỖNG. Nếu vậy nó vẫn tự gọi Finalize () và điều đó làm giảm hiệu suất khi không có tác dụng gì.

- Không thể định nghĩa hàm này trong một struct mà chỉ sử dụng ở class. Một class chỉ tạo được một hàm hủy mà thôi.

- Hàm hủy không có tham số truyền vào.


C. Overloading Method
- Hay còn được gọi là nạp chồng phương thức. Có thể hiểu đơn giản là ta có thể triển khai 2 hay nhiều phương thức (method) mà nó trùng tên trong cùng một class.


using System;

namespace TestClassOOP
{

class People
{

void methodOverloading()
{
Console.WriteLine("Hello !");
}

void methodOverloading(string world)
{
Console.WriteLine(world);
}

int methodOverloading(int a)
{
return a;
}

float methodOverloading(int a, int b)
{
return a * b;
}
}
}

Ta thử gọi những hàm này để dùng xem sao nhé:



Lúc này bạn sẽ tháy có 4 lựa chọn cho bạn, tương ứng với 4 hàm mà bạn đã tạo ở trên.




Chúng ta có thể dễ dàng phân biệt các hàm dựa vào tham số truyền vào của chúng.


- Khi bạn sử dụng Overloading thì không được phép tạo cùng lúc 2 hàm mà tham số truyền vào là giống nhau, xét về mặt vị trí. Hai hàm có tham số đầu vào rỗng cũng là có cùng tham số và không hợp lệ. Nếu giống nhau mà khác vị trí thì hợp lệ. Ở đây ta không xét type của nó (void, string, int, float ...). Hai hàm float và string cùng trùng tham số và vị trí đều không hợp lệ.





Như vậy !

Ở C# khi sử dụng các hàm trùng tên trong một lớp thì đó chính là Overloading. Ưu điểm của cách dùng này giúp bạn giảm thiểu đặt tên cho các phương thức chung hình thức mà vẫn biết được mình cần dùng gì


abstract public  class People
{
abstract public void methodOverloading();

abstract public void methodOverloading(string world);

abstract public int methodOverloading(int a);

abstract public float methodOverloading(int a, int b);
}

Bạn có thể dùng nó cho lớp cha để cho các lớp con kế thừa hoặc dùng với abstract để lớp con triển khai đều được. Và chúng ta sẽ đi tiếp hiểu trong bài sau . . . ;))
Nguồn: Tự Học IT Online - http://tuhocit.net

Xem Nhiều