• Thứ Hai, 19/03/2007 14:07 (GMT+7)

    Lấy csdl các record bất kỳ

    Câu hỏi :

    Trong C#, làm sao để 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.
     



    Trả lời :

    Để giải quyết vấn đề của bạn, cần giải quyết 2 vấn đề chính:

    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.

    Chuyên mục: Cơ sở dữ liệu