Lập trình C# (C Sharp)

SqlCommand

Lớp SqlCommand cho phép tạo ra đối tượng mà từ đó có thể thi hành các lệnh SQL như các lệnh UPDATE|INSERT|CREATE TABLE|SELECT ... cũng như cho phép gọi thẳng các hàm, các stored procedure của Database

Ví dụ đơn giản dùng SqlCommand thi hành lệnh SQL:

//Cần khởi tạo ra SqlConnection trước, cách làm tại SqlConnection
SqlConnection connect = ?;

String queryString = "select age from user where id = 1223";
SqlCommand sqlCommand = new SqlCommand(queryString, connect);

//Hoặc gán connect, querryString sau
/*
    SqlCommand sqlCommand = new SqlCommand();
    sqlCommand.CommandText = queryString;
    sqlCommand.Connection = connect;
*/

//Thi hành lệnh và lấy kết quả đầu tiên, đảm bảo SqlConnection đã Open
object age = sqlCommand.ExecuteScalar();

Như vậy để thi hành lệnh SQL với SqlCommand, thì cần có một kết nối trước (SqlConnection), rồi tạo ra đối tượng SqlCommand rồi gán cho nó kết nối, câu lệnh SQL rồi thi hành bằng một trong các lệnh như ExecuteScalar, ExecuteNonQuery, ExecuteReader ...

Dưới đây là một số thiết lập khác với SqlCommand và vài cách thức thi hành SqlCommand

CommandType

Thiết lập nội dung CommandText là câu lệnh SQL

Mặc định SqlCommand sẽ coi nội dung trong thuộc tính CommandText là câu lệnh SQL vì nó đã thiết lập CommandType bằng CommandType.Text (xem ví dụ trên)

sqlCommand.CommandType = CommandType.Text;

Thiết lập nội dung CommandText là tên hàm/stored procedure

Giả sử muốn gọi đến stored procedure có tên myprocedure của Database, thì bạn cần gán tên stored procedure vào CommandText và thiết lập CommandType bằng CommandType.StoredProcedure

//...
sqlCommand.CommandType = CommandType.StoredProcedure;
sqlCommand.CommandText = "myprocedure";
object value = sqlCommand.ExecuteScalar();
//..

Thiết lập các tham số cho SqlCommmand

Trở lại câu lệnh SQL ở phía trên:

select age from user where id = 1223

Thấy rằng giá trị truyền vào id1223 thiết lập ngay bên trong câu lệnh SQL. Tuy nhiên có thể thiết lập giá trị truyền vào id như một tham số gán sau, lúc này câu lệnh sẽ viết lại là:

select age from user where id = @idvalue

Ta có @idvalue sẽ là tên tham số (chú ý có @), tên này sẽ được dùng để gán sau, với SqlCommand thì các tham số sẽ thiết lập từ thuộc tính SqlCommand.Parameters, để thiết lập giá trị cho một tham số hãy gọi SqlCommand.Parameters.AddWithValue("@tenthamso", giatri), ví dụ:

//..
sqlCommand.CommandText
    = "select fullname from user where age > @param1 and age <@param2";

sqlCommand.Parameters.AddWithValue("@param1", 10);
sqlCommand.Parameters.AddWithValue("@param1", 12);

object value = sqlCommand.ExecuteScalar();
//..

Các cách thi hành SqlCommand

Có các phương thức khác nhau để thi hành SqlCommand tùy theo ngữ cảnh với mục đích khác nhau, gồm có các phương thức: ExecuteScalar, ExecuteNonQuery, ExecuteReader, ExecuteXmlReader

ExecuteScalar

Nếu thi hành SqlCommand bằng phương thức ExecuteScalar thì nó sẽ thi hành lệnh SQL và trả về 1 giá trị là cột đầu tiên của dòng đầu tiên. Lưu ý: giá trị có độ dài tối đa 2033 ký tự

Ví dụ sau sẽ chèn một dòng mới vào bảng và trả về giá trị định danh của dòng mới chèn vào (ID)

//..
sqlCommand.CommandText =
    "INSERT INTO User (Name) VALUES (@Name);" + //Chèn dữ liệu mới
    "SELECT CAST(scope_identity() AS int)";     //Lấy định danh

sqlCommand.Parameters.AddWithValue("@Name", "ABC");
object value = sqlCommand.ExecuteScalar();
//..

ExecuteNonQuery

Thi hành SqlCommand bằng phương thức ExecuteNonQuery thì nó sẽ thi hành lệnh SQL (UPDATE, INSERT, DELETE), nhưng không trả về kết quả nào. Sử dụng cách này nếu thi hành các lệnh SQL như UPDATE, DELETE ... mà không quan tâm kết quả trả về

ExecuteReader

Thi hành SqlCommand với phương thức thì nó sẽ tạo ra đối tượng SqlDataReader được mở sẵn, từ đối tượng đó giúp đọc từng dòng kết quả trả về.

Một số phương thức trong SqlDataReader

  • SqlDataReader.HasRows() cho biết có dòng dữ liệu nào không
  • SqlDataReader.Read() nạp dữ liệu dòng tiếp theo, nếu trả về true là có dòng dữ liệu nạp về thành công, nếu false là đã hết dữ liệu nạp về. Sau khi gọi phương thực này, thì các cột của dòng có thể đọc bằng các toán tử [cột], hoặc các hàm đọc dữ liệu như .GetInt32(cột), .GetString(cột) ...
  • SqlDataReader.Close() đóng Reader sau khi đọc xong dữ liệu
//..
SqlCommand command =
    new SqlCommand("SELECT CategoryID, CategoryName FROM Categories;", connection);

SqlDataReader reader = command.ExecuteReader();
if (reader.HasRows)
{
    while (reader.Read())
    {
        Console.WriteLine("{0}\t{1}", reader[0].ToString(), reader.GetString(1));
    }
}
else
{
    Console.WriteLine("No rows found.");
}
reader.Close();
//..

Ngoài ra khi có được đối tượng SqlDataReader, có thể lấy toàn bộ kết quả trả về của SqlCommand đưa vào DataTable

//...
SqlCommand command =
        new SqlCommand("SELECT CategoryID, CategoryName FROM Categories;", connection);
using (SqlDataReader reader = command.ExecuteReader())
{
    DataTable myTable = new DataTable();

    if (reader.HasRows)
    {
        myTable.Load(reader);
    }
    else
    {
        //No rows
    }
}
//...

ExecuteXmlReader

Thi hành SqlCommand với phương thức thì nó sẽ tạo ra đối tượng System.Xml.XmlReader, từ đối tượng đó giúp đọc từng dòng kết quả trả về theo cấu trúc XML.