Ngôn ngữ ASP.NET - Đối tượng Command

Giới thiệu đối tượng Command

Sau khi chúng ta đã kết nối vào nguồn dữ liệu, chúng ta cần phải thực hiện thao tác các dữ liệu. Để thao tác được với các dữ liệu chúng ta phải dùng đối tượng Command. Đối tượng Command là đối tượng rất “đa năng”, nó vừa xử lý được sqlserver stored procedures vừa xử lý được các giao tác (transaction).
Tương tự như đối tượng Connection, đối tượng Command cũng chia ra làm 2 loại tuỳ theo nguồn dữ liệu : SqlCommand (cho SQL Server) và OleDbCommand (cho OLE DB).

Tùy theo loại Connection đối tượng Command thuộc tên miền:

  •     System.Data.OleDb.OleDbCommand
  •     System.Data.SqlClient.SqlCommand

Tạo Command 
Chúng ta có thể tạo Command thông qua đối tượng Connection bàng cách:

<Loai command>  <Biến Command> =  New <Loai command>;
<Biến command>.Connection=<Biến Connection>;
<Biến Command>.CommandText=<Lệnh SQL>;

 Hoặc

<Loai Command>  <Biến Command> = New <Loại >Command(<Lệnh SQL>);
<Biến Command>.Connection=<Biến Connection>;

Một số thuộc tính và phương thức thông dụng của đối tượng Command :
Thuộc tính :

  • CommandText : Thiết lập/ Lấy lệnh thao tác với dữ liệu.
  • CommandTimeout : Thiết lập/ Lấy thời gian chờ thực hiện lệnh. Sau khi chờ 1 khoảng thời gian nếu vượt quá sẽ báo lỗi.
  • CommandType : Thiết lập/ Lấy kiểu của đối tượng lệnh (lệnh trực tiếp, stored procedure…)
  • Parameters : Các tham số truyền vào cho đối tượng command (ở kiểu OleDbParameterCollection/ SQLParameterCollection).
  • Connection : Thiết lập / lấy kết nối đang được đối tượng Command sử dụng.
  • Transaction : Thiết lập / lấy giao tác mà đối tượng Command thực thi.

Phương thức:

  • ExecuteReader : Thực thi câu lệnh CommandText của đối tượng Command và trả về kiểu DataReader (OleDbDataReader / SqlDataReader ).
  • ExecuteNonQuery : Thực thi câu lệnh CommandText của đối tượng Command, đây là dạng câu lệnh cập nhật cơ sở dữ liệu (xoá /sửa) nên chỉ trả về số dòng bị ảnh hưởng mà không trả về dòng dữ liệu nào.
  • ExecuteScalar : Thực thi câu truy vấn của đối tượng Command và chỉ trả về cột đầu tiên của dòng đầu tiên của kết quả. Các kết quả còn lại bị bỏ qua.

Ví dụ : Dùng SqlCommand sau:

SqlCommand cmd As SqlCommand = New SqlCommand();
cmd.Connection = cnn;
cmd.CommandType = CommandType.Text;
cmd.CommandText = "Select* From Khachhang Where MaKH=2";

Cách truyền tham số (Parameters)
Lệnh SQL trong commandText có thể sử dụng dấu ? thay cho trị chưa xác định và khi thực hiện sẽ dùng đối tượng Parameters để truyền gái trị vào dấu ? . Tùy theo Command Parameter sẽ khai báo từ lớp OledbParameter hay SqlParameter. Cú pháp khai báo sau:

  • Access 
OleDbParameter <tên Parameter> = New OleDbParameter();
OleDbParameter <Ten Parameter> = New OleDbparameter(<Tên>);
OleDbParameter <Tên parameter> = New OleDbParameter (<tên>,<giá>); 
  • SQLServer 
SqlParameter <tên Parameter> = New SqlParameter();
SqlParameter <Ten Parameter> = New SqlParameter(<Tên>);
SqlParameter <Tên parameter> = New SqlParamter(<tên>,<giá>); 

Các thuộc tính cần chú ý:

  • Direction: Giá trị cho biết lọai tham số
    • Input: (mặc định) Loại tham số đầu vào
    • InputOutput: Loại tham số đầu vào và ra 
    • Output: Loại tham số đầu  ra
    • ReturnValue: Loại tham số nhận trị trả về
  • OleDbType / SqlDbType: Kiểu dữ liệu của tham số.
  • ParameterName: Tên tham số
  • Value: Giá trị tham số 

Ví dụ: Khi sử dụng OleDbCommand

cmd.CommandText=”Select * From KhachHang 
Where MaKH=?”;
OleDbParameter Par  = cmd.CreateParameter();
Par.Value=”KH01”;
cmd.Parameters.Add(Par);

Ví dụ: Khi sử dụng SqlDbCommand

cmd.CommandText=”Select * From KhachHang 
Where MaKH=@MaKH”;
SqlParameter Par= cmd.CreateParameter();
Par.ParameterName=”@MaKH”;
Par.Value=”KH01”;
cmd.Parameters.Add(Par);

Đưa tham số vào tập hợp Parameters
Ví dụ: Khi sử dụng OleDbCommand

cmd.CommandText=”Select * From BangDiem Where Masv=?  And MaMH=?”;
OleDbParameter Par1 = 
cmd.CreateParameters.Add(“Sinhvien”,OleDbType.Char,4);
Par1.Value=”SV01”
OleDbParameter Par2 = 
cmd.CreateParameters.Add(“Monhoc”,OleDbType.Char,4);
Par2.Value=”MH01”

Ví dụ: Khi sử dụng SqlDbCommand

cmd.CommandText=”Select * From BangDiem  Where Masv=@MaSV and MaMH = @MaMH ”;
SqlDbParameter Par1 = cmd.CreateParameters.Add(“@MaSV”,SqlType.Char,4);
Par1.Value=”SV01”
SqlDbParameter Par2 = cmd.CreateParameters.Add(“@MaMH”,SqlType.Char,4);
Par2.Value=”MH01”;

Tạo tham số và đưa vào tập hợp Parameters
Ví dụ: Procedure SpKetQuaThi cần 2 tham số đầu vào: @MaSV , @MaMH và trả về Điểm thi của Môn học của sinh viên đó. 

cmd.CommandText=”spKetQuaThi”;
cmd.CommandType=CommandType.StoredProcedure;
OleDbParameter ts3 = OleDbParameter();
ts3.Direction=ParameterDirection.ReturnValue;
ts3.OleDbType=OleDn.OleDbType.Int;
cmd.parameters.Add(ts3);
OleDbParameter ts1 = OleDbParameter=
cmd.Parameters.Add(“@MaSV”,OleDbType.Char,4);
Ts1.Value=”Sv01”;
OleDbParameter ts2 =
cmd.Parameters.Add(“@MAMH”,OleDbType.Char,4);
Ts1.Value=”MH01”; 

Thực hiện Command:

  • Phương thức ExecuteReader: Trả về đối tượng  DataReader để đọc dữ liệu mỗi lần một dòng với phương thức Read.(DataReader đọc dữ liệu trực tiếp từ nguồn nên phải duy trì kết nối đến khi đọc xong)
     SqlDataReader  <Tên DataReader> = new SqlDataReader();
    <Tên DataReader> = <tên Command>.ExecuteReader();

Ví dụ: 

SqlDataReader   rd = new  SqlDataReader();
rd = cmd.ExecuteReader();
  •  Phương thức ExcuteNoneQuery: Dùng thực thi các phát biểu T-Sql như: Insert, Update, Delete, Create,… 
  •  Phương thức ExcuteScalar: Trả về từ phát biểu SQL dạng Select chỉ có một cột một hàng. 

Ví dụ 1: Sử dụng Command với câu lệnh Select 

try
        { 
         SqlConnection cnn = new SqlConnection("Data Source=(local);Initial Catalog=QLbansach;User ID=sa;Password=");
	     SqlCommand cmd = new SqlCommand();
	     cmd.Connection = cnn;
	    //Loại command là câu lệnh SQL
	     cmd.CommandText = "Select Count(*) From Chude";
         cmd.CommandType = CommandType.Text;
         //Mở kết nối và lấy dữ liệu
         cnn.Open();
	     int count = (int)cmd.ExecuteScalar();
	     response.write(count.ToString());
	      cnn.Close();
        }
        catch (Exception)
        {
	      response.write("Không thành công!“);
        }

Ví dụ 2: Sử dụng Command với lệnh Insert,Update,Delete

try
  {
	SqlConnection cnn = new SqlConnection("Data Source=(local);Initial Catalog=QLbansach;User ID=sa;Password=");
    SqlCommand cmd = new SqlCommand();
    cmd.Connection = cnn;
    //Biến Commnad thao tác Insert, Update, Delete
	cmd.CommandText = "Insert Into Chude(tencd) Values(n'văn hóa')";
    cmd.CommandType = CommandType.Text;
    cnn.Open();
	cmd.ExecuteNonQuery();
    response.write("Thành công!“);
    cnn.Close();
    }
    catch (Exception)
    {
        response.write(“Thất bại!“);
    }

Ví dụ 3: Command với lệnh Insert,Update,Delete + Tham số

try
  {
	SqlConnection cnn = new SqlConnection("Data Source=(local);Initial Catalog=QLbansach;User ID=sa;Password=");
    SqlCommand cmd = new SqlCommand();
    cmd.Connection = cnn;
	SqlParameter parTenLinhVuc = new SqlParameter("@TENCHUDE", SqlDbType.NVarChar, 50);
	cmd.CommandText = "INSERT INTO CHUDE VALUES(@TENCHUDE)";
	cmd.CommandType = CommandType.Text;
	cmd.Parameters.Add(parTenchude);
	parTenLinhVuc.Value = TextBox1.Text;
    cnn.Open();
    cmd.ExecuteNonQuery();
    cnn.Close();
    response.write("Thành công!“);
   }
   catch (Exception)
   {
      response.write(“Thất bại!“);
   }

Tổng kết

Đối tượng Command cho phép bạn truy vấn và gửi lệnh đến một database. Nó có các phương thức sử dụng cho các lệnh khác nhau. Phương thức ExecuteReader() trả về một đối tượng SqlDataReader để hiển thị kết quả của câu truy vấn. Cho các lệnh insert, update và delete, bạn dùng phương thức ExecuteNonQuery(). Nếu bạn chỉ cần một giá trị đơn từ một câu truy vấn, phương thức ExecuteScalar() là lựa chọn tốt nhất.