Lấy từng record theo một cách ngẫu nhiên

Bài viết hướng dẫn dùng C# để lấy ra lần lượt từng record theo một cách ngẫu nhiên từ danh sách có sẵn. Ví dụ danh sách record từ thứ 30 đến 80, thì có thể lấy bắt đầu từ record 32 rồi 39 rồi 50 rồi 79 rồi 35… cho tới khi hết 50 record thì ngừng.

1. Tạo 1 dãy N=50 phần tử, mỗi phần tử là 1 số ngẫu nhiên trong phạm vi từ Min=30 tới Max=80. Trong môi trường .Net, bạn có thể dùng class Random để tạo các số ngẫu nhiên.
2. Truy xuất database (table) theo thứ tự ngẫu nhiên. Thực ra, trong tuyệt đại đa số bài toán truy xuất database, người ta chỉ muốn truy xuất các record thỏa mãn 1 số điều kiện nào đó và theo 1 thứ tự xác định nào đó chứ hiếm khi truy xuất ngẫu nhiên như bạn muốn. Một lưu ý nữa, thứ tự vật lý các record trong 1 table là không có nghĩa, thứ tự chỉ có nghĩa khi bạn xác định 1 tiêu chuẩn sắp xếp nào đó. Ở đây, chúng tôi sẽ sử dụng các đối tượng ODBC .Net như ODBCConnection, OdbcDataAdapter, DataSet, DataTable, DataRow để truy xuất database theo thứ tự ngẫu nhiên theo yêu cầu của bạn. Đoạn code C# sau là của 1 Form chứa 2 đối tượng giao diện: 1 button để thực thi và 1 listbox để hiển thị các record được truy xuất theo thứ tự ngẫu nhiên.

public partial class Form1 : Form {
//khai báo dãy chứa các số ngẫu nhiên
int[] ranArr = new int[50];
//các lệnh khác đã có

//hàm xử lý ấn chuột vào button
private void OnClick(object sender, EventArgs e){
TaoDayNgaunhien();
// truy xuất database theo random
DocNgaunhien();
}

//hàm tạo các số ngẫu nhiên
private void TaoDayNgaunhien() {
int i;
// khởi động giá trị đầu từ 30 tới 79 cho dãy số
for (i = 0; i < 50; i++) ranArr[i] = 30 + i;
//tạo đối tượng tạo số ngẫu nhiên
Random autoRand = new Random();
//lập tạo số ngẫu nhiên
for (i = 49; i > 0; i–) {
//lấy 1 chỉ số ngẫu nhiên <=i
int r = autoRand.Next() % (i + 1);
//hoán vị phần tử ngẫu nhiên với cận trên của dãy
int temp = ranArr[i];
ranArr[i] = ranArr[r]; ranArr[r] = temp;
}
}
//hàm truy xuất table theo thứ tự ngẫu nhiên
private void DocNgaunhien(){
try {
//Connection string dùng DSN
string MyConString = “DSN=Gallery”;

//tạo connection tới database
OdbcConnection MyConnection = new OdbcConnection(MyConString);
MyConnection.Open();
//tạo đối tượng DataDataApdater
//Products là tên table dữ liệu cần truy xuất
string queryString = “SELECT * FROM Products”;
OdbcDataAdapter adapter = new OdbcDataAdapter(queryString, MyConnection);
//tạo đối tượng DataSet
DataSet dataset = new DataSet();
adapter.Fill(dataset);
//tạo đối tượng DataTable
DataTable table=dataset.Tables[0];
//duyệt và xử lý các record theo thứ tự ngẫu nhiên
for (int i = 0; i < 50; i++){
//xác định record ngẫu nhiên
DataRow row = table.Rows[ranArr[i]];
//xử lý : hiển thị 1 field của record lên ListBox
listBox1.Items.Add (row[1]);
}
//Đóng các đối tượng đã dùng
MyConnection.Close();
}
catch (OdbcException MyOdbcException) {//Catch tất cả lỗi exception
for (int i=0; i < MyOdbcException.Errors.Count; i++) {
Console.Write(“ERROR #” + i + “n” + “Message: ” +
MyOdbcException.Errors[i].Message + “n” + “Native: ” +
MyOdbcException.Errors[i].NativeError.ToString() + “n” +
“Source: ” + MyOdbcException.Errors[i].Source + “n” +
“SQL: ” + MyOdbcException.Errors[i].SQLState + “n”);
}
}
} //end of DocNgaunhien
} //end of Form1

Lưu ý rằng đoạn code VC# ở trên truy xuất database theo DSN, do đó trước khi chạy đoạn code này, bạn phải định nghĩa 1 DSN tên là Gallery để miêu tả cụ thể database của bạn. Để định nghĩa DSN mới, bạn hãy chạy Control Panel.Administrator Tools.Data Source.