Mysqldatareader

Khi học làm việc với cơ sở dữ liệu Sql Server, bạn chắc chắn đã biết vai trò của trò chơi và cách thực hiện cuộc thi truy vấn. Tuy nhiên, trong chương trình C#, việc thực thi truy vấn Sql không hoàn toàn giống như vậy. Để thực hiện truy vấn Sql trong chương trình C# cần sử dụng một lớp hỗ trợ của ADO. NET có tên là SqlCommand. Ngoài ra, để đọc được kết quả của truy vấn Sql còn cần những kỹ thuật lập trình riêng

Bài học này sẽ giới thiệu với bạn tất cả những gì cần biết về việc thực thi truy vấn Sql từ chương trình C# sử dụng Layer SqlCommand và các kỹ thuật thù địch đặc biệt cho quá trình này

NỘI DUNG CỦA BẢNG

[id khóa đăng nhập=”16252″]

Truy vấn SQL trong C#

Trong bài học trước, bạn đã biết cách kết nối với Sql Server. Sau khi kết nối thành công, công việc tương tác với cơ sở dữ liệu cần hai thao tác. [1] Chỉ định những dữ liệu mà chương trình cần;

Chỉ định những dữ liệu mà chương trình quan tâm thực hiện bằng cách gửi truy vấn viết bằng ngôn ngữ SQL. Truy vấn SQL thực chất đều là các chuỗi văn bản

Lưu ý rằng, ngôn ngữ SQL không hoàn toàn giống nhau trên các hệ thống quản trị cơ sở dữ liệu. SQL Server của Microsoft sử dụng T-SQL, trong khi Oracle sử dụng PL/SQL

THỪA NHẬN. NET hỗ trợ thực hiện truy vấn SQL [đến SQL Server] và đọc kết quả thông qua việc sử dụng đối tượng của lớp SqlCommand

Lớp SqlCommand

SqlCommand [tên đầy đủ là

using System;
using System.Data.SqlClient;
namespace P01_Scalar
{
    class Program
    {
        static void Main[string[] args]
        {
            Console.Title = "Retrieve scalar value";
            // lưu ý thay connectionString của mình
            var connectionString = @"Data Source =.\sqlexpress; Initial Catalog = Contacts; Integrated Security = True";
            // sử dụng cấu trúc using để connection tự động close sau khi kết thúc khối code
            using [var connection = new SqlConnection[connectionString]]
            {
                // truy vấn SQL
                var commandText = "SELECT COUNT[*] FROM CONTACTS";
                // khởi tạo object của lớp SqlCommand
                var command = new SqlCommand[commandText, connection];                
                // lưu ý phải mở kết nối trước khi thực thi truy vấn
                connection.Open[];
                // thực thi truy vấn để lấy kết quả scalar
                var count = [int]command.ExecuteScalar[];
                Console.WriteLine[$"{count} contacts found in the database"];
            }
            Console.ReadKey[];
        }
    }
}
0] là lớp chịu trách nhiệm thực thi truy vấn trên một kết nối tới cơ sở dữ liệu Sql Server

Chúng ta có thể cấu hình dung đối tượng của lớp SqlConnection để tạo kết nối tới Sql Server tương tự như đặt một đường ống thông tin từ chương trình C# tới Sql Server. Đối tượng của SqlCommand giống như cái đầu tiên được đặt ở đầu ống dẫn chương trình. Nó có nhiệm vụ truy vấn về phía Sql Server và “hút” dữ liệu [kết quả của truy vấn] từ Sql Server về chương trình

Khởi tạo đối tượng

Có một số cách khởi tạo đối tượng của lớp SqlCommand

var command1 = new SqlCommand[];
 // cung cấp chuỗi truy vấn khi khởi tạo
 var commandText = "Select * from Contacts";
 var command2 = new SqlCommand[commandText];
 // cung cấp chuỗi truy vấn + object connection khi khởi tạo
 var connection = new SqlConnection[];
 var command3 = new SqlCommand[commandText, connection];
// cũng có thể tạo command trực tiếp từ connection
 var connection = new SqlConnection[];
 var command = connection.CreateCommand[];

Một số thuộc tính của SqlCommand

LệnhVăn bản. Chứa chuỗi truy vấn SQL cần thực hiện

Sự liên quan. Chứa đối tượng của kết nối được sử dụng để kết nối với cơ sở dữ liệu

Loại lệnh. xác định xem mình cần thực hiện truy vấn SQL [giá trị CommandType. Text] hoặc cần gọi hàm stored procedure [giá trị CommandType. StoredProcedure] thông qua đối tượng của SqlCommand. default value is Text

Thông số. danh sách tham số được sử dụng trong truy vấn. Nội dung này sẽ trình bày ở một phần cuối bài riêng

Hai thông tin quan trọng nhất mà đối tượng SqlCommand cần biết là đối tượng của lớp SqlConnection và chuỗi truy vấn Sql. Hai thông tin này phải được cung cấp cho đối tượng SqlCommand trước khi gọi lệnh thực hiện bất kỳ truy vấn nào

Một số phương thức quan trọng của SqlCommand

Thực thiNonQuery[]. chuyên để thực thi các truy vấn không trả về dữ liệu [INSERT, UPDATE, DELETE]

Thực thiScalar[]. thực thi các truy vấn trả lại MỘT giá trị duy nhất, thường là kết quả của truy vấn Tổng hợp [SELECT COUNT. TỐI THIỂU. TỐI ĐA. AVG]

Thực thiReader[]. thực thi các truy vấn được trả lại giá trị như các truy vấn SELECT thông thường

Xử lý kết quả truy vấn của SqlCommand

Đối với việc nhận kết quả, tùy thuộc vào từng loại truy vấn sẽ có những kỹ thuật khác nhau

Như bạn đã biết, ngôn ngữ SQL có 4 loại truy vấn dữ liệu chính. CHÈN, CẬP NHẬT, XÓA và CHỌN. Trong đó, INSERT, UPDATE, DELETE không trả lại kết quả. Phương thức ExecuteNonQuery[] dùng để thực hiện truy vấn này. Kết quả thực hiện của phương thức là số bản ghi chịu ảnh hưởng của truy vấn

Riêng đối với SELECT, tùy từng truy vấn phải sử dụng cách lưu trữ dữ liệu phù hợp

Đối chiếu với các truy vấn kiểu SELECT COUNT. TỐI THIỂU. TỐI ĐA. AVG, kết quả trả về chỉ là một giá trị đơn. Phương thức ExecuteScalar sẽ lưu kết quả vào một biến kiểu Object. You can cast it sang kiểu phù hợp để sử dụng tiếp

Đối với truy vấn SELECT khác, kết quả trả về là một tập hợp dữ liệu. Một phần kết quả của truy vấn này được lưu [tạm thời] trong một đối tượng

using System;
using System.Data.SqlClient;
namespace P01_Scalar
{
    class Program
    {
        static void Main[string[] args]
        {
            Console.Title = "Retrieve scalar value";
            // lưu ý thay connectionString của mình
            var connectionString = @"Data Source =.\sqlexpress; Initial Catalog = Contacts; Integrated Security = True";
            // sử dụng cấu trúc using để connection tự động close sau khi kết thúc khối code
            using [var connection = new SqlConnection[connectionString]]
            {
                // truy vấn SQL
                var commandText = "SELECT COUNT[*] FROM CONTACTS";
                // khởi tạo object của lớp SqlCommand
                var command = new SqlCommand[commandText, connection];                
                // lưu ý phải mở kết nối trước khi thực thi truy vấn
                connection.Open[];
                // thực thi truy vấn để lấy kết quả scalar
                var count = [int]command.ExecuteScalar[];
                Console.WriteLine[$"{count} contacts found in the database"];
            }
            Console.ReadKey[];
        }
    }
}
1

SqlDataReader hoạt động theo kiểu chỉ chuyển tiếp và chỉ đọc. SqlDataReader cho phép đọc từng hàng trong tập hợp dữ liệu theo một chiều từ đầu đến cuối [chỉ chuyển tiếp]. Unable to read the direction back. SqlDataReader chỉ cho phép đọc dữ liệu ra mà không cho phép sửa dữ liệu [chỉ đọc]. Do đó, nếu muốn lưu trữ kết quả để sử dụng lâu dài, bạn phải sử dụng một cơ chế lưu trữ khác

Cách thức làm việc cụ thể của SqlDataReader sẽ xem xét phần ví dụ dưới đây

Thực hiện truy vấn Sql trong C# với SqlCommand

Thực thi truy vấn tổng hợp

Các đơn lẻ dữ liệu này được trả về từ các truy vấn loại Aggregate as SELECT COUNT. TỐI THIỂU. TỐI ĐA. AVG được gọi là giá trị vô hướng

Chúng ta sẽ xem xét cách thực hiện cuộc thi và lấy kết quả cho loại truy vấn này thông qua việc thực hiện một ví dụ

Ví dụ minh họa này sử dụng cơ sở dữ liệu từ bài thực hành Lập trình ADO. NET cơ bản

Bước 1. Create a new solution set name is S02_SqlCommand. Trong giải pháp này tạo dự án [Ứng dụng bảng điều khiển] đặt tên là P01_Scalar

Bước 2. Open file Program. cs và viết mã

using System;
using System.Data.SqlClient;
namespace P01_Scalar
{
    class Program
    {
        static void Main[string[] args]
        {
            Console.Title = "Retrieve scalar value";
            // lưu ý thay connectionString của mình
            var connectionString = @"Data Source =.\sqlexpress; Initial Catalog = Contacts; Integrated Security = True";
            // sử dụng cấu trúc using để connection tự động close sau khi kết thúc khối code
            using [var connection = new SqlConnection[connectionString]]
            {
                // truy vấn SQL
                var commandText = "SELECT COUNT[*] FROM CONTACTS";
                // khởi tạo object của lớp SqlCommand
                var command = new SqlCommand[commandText, connection];                
                // lưu ý phải mở kết nối trước khi thực thi truy vấn
                connection.Open[];
                // thực thi truy vấn để lấy kết quả scalar
                var count = [int]command.ExecuteScalar[];
                Console.WriteLine[$"{count} contacts found in the database"];
            }
            Console.ReadKey[];
        }
    }
}

Có thể thấy rằng, thực thi và đọc kết quả từ truy vấn Aggregate với SqlCommand rất đơn giản. [1] sử dụng phương thức ExecuteScalar của SqlCommand;

Phương thức ExecuteScalar của lớp SqlCommand chuyên để thực thi các truy vấn Sql đã trả về một kết quả đơn. Giá trị được ExecuteScalar trả về luôn có kiểu đối tượng. Do đó, nếu muốn sử dụng kết quả này trong các tính toán khác, bạn phải ép kiểu [type casting] về kiểu mình mong muốn

Thực hiện truy vấn Lựa chọn

Bước 1. Tạo thêm project P02_DataReader trong solution. Thiết lập để dự án này làm dự án StartUp

Bước 2. Viết mã như sau

using System;
using System.Data;
using System.Data.SqlClient;
namespace P02_DataReader
{
    class Program
    {
        private static void Main[string[] args]
        {
            Console.Title = "Retrieve data set";
            var connectionString = @"Data Source=.\sqlexpress;Initial Catalog=Contacts;Integrated Security=True";
            using [var connection = new SqlConnection[connectionString]]
            using [var command = new SqlCommand["SELECT * FROM CONTACTS", connection]]
            {
                connection.Open[];
                var sqlDataReader = command.ExecuteReader[CommandBehavior.CloseConnection];
                if [sqlDataReader.HasRows]
                {
                    while [sqlDataReader.Read[]]
                    {
                        var id = sqlDataReader.GetInt32[0];
                        var contactName = sqlDataReader.GetString[1];
                        var alias = sqlDataReader.GetString[2];
                        Console.WriteLine[$"[{id}] {contactName} [{alias}]"];
                    }
                }
            }
            Console.ReadLine[];
        }
    }
}

Ví dụ: đọc tất cả các bản ghi từ bảng Danh bạ và trong màn hình. Trong ví dụ này, sử dụng phương thức ExecuteReader và đối tượng của lớp SqlDataReader

Use method ExecuteReader

Lưu ý rằng phương thức ExecuteReader có một tham số thuộc kiểu CommandBehavior [

using System;
using System.Data.SqlClient;
namespace P01_Scalar
{
    class Program
    {
        static void Main[string[] args]
        {
            Console.Title = "Retrieve scalar value";
            // lưu ý thay connectionString của mình
            var connectionString = @"Data Source =.\sqlexpress; Initial Catalog = Contacts; Integrated Security = True";
            // sử dụng cấu trúc using để connection tự động close sau khi kết thúc khối code
            using [var connection = new SqlConnection[connectionString]]
            {
                // truy vấn SQL
                var commandText = "SELECT COUNT[*] FROM CONTACTS";
                // khởi tạo object của lớp SqlCommand
                var command = new SqlCommand[commandText, connection];                
                // lưu ý phải mở kết nối trước khi thực thi truy vấn
                connection.Open[];
                // thực thi truy vấn để lấy kết quả scalar
                var count = [int]command.ExecuteScalar[];
                Console.WriteLine[$"{count} contacts found in the database"];
            }
            Console.ReadKey[];
        }
    }
}
0] được sử dụng để xác định hành động khi hoàn thành thực hiện truy vấn. CloseConnection value signal is being close SqlDataReader after when complete data data

Nếu không đóng SqlDataReader sau khi đọc dữ liệu thì truy vấn tiếp theo trên SqlCommand sẽ không thực hiện được. Close SqlDataReader không đồng nghĩa với close connection

A number of other value of CommandBehavior bao gồm

  • Mặc định. truy vấn có thể trả về nhiều kết quả tập tin và có thể ảnh hưởng đến trạng thái của cơ sở dữ liệu. Gọi ExecuteReader[CommandBehavior. Default] tương đương với ExecuteReader[] không tham số
  • KeyInfo. truy vấn chỉ lấy thông tin về cột và từ khóa chính
  • Chỉ lược đồ. truy vấn chỉ trả về thông tin của các cột, không trả về dữ liệu
  • Kết quả đơn. query only return a data file. Phân biệt với Mặc định – Trả về nhiều tệp dữ liệu
  • Hàng đơn. query only return a data line

Mỗi truy vấn SELECT trả về một số dòng thuộc cùng một bảng. THỪA NHẬN. NET gọi kết quả của nhóm dòng này là một tập kết quả [tập hợp kết quả]. SqlCommand cho phép thực hiện NHIỀU truy vấn cùng lúc. Khi đó một lệnh ExecuteReader có thể trả về kết quả NHIỀU tập tin. This is default default default [tham số Mặc định]. Ở một khía cạnh khác, nếu CommandBehavior được định nghĩa chỉ là SingleResult thì SqlCommand chỉ lấy về một kết quả tập tin

Use SqlDataReader

Kết quả trả về của ExecuteReader là một đối tượng của SqlDataReader. Đối tượng này hỗ trợ đọc dữ liệu theo kiểu chỉ chuyển tiếp và chỉ đọc như bạn đã biết

Nguyên tắc làm việc chung của SqlDataReader như sau

  • Sử dụng thuộc tính HasRows để kiểm tra xem truy vấn có trả lại dữ liệu hay không
  • If has data, the time allow through each lines to read information
  • Để duyệt qua từng dòng, sử dụng phương thức Read[]. Phương thức này sẽ chuyển “con trỏ” lần lượt qua từng dòng. Khi nó dừng lại ở bất kỳ dòng nào, chúng ta có thể sử dụng các phương thức để đọc từng ô dữ liệu của dòng đó
  • Để đọc dữ liệu từ một ô, bạn có thể sử dụng các phương thức Nhận kiểu dữ liệu tương ứng. Tham số của phương thức này là số thứ tự của ô trong dòng. Trong ví dụ trên chúng tôi đã sử dụng phương pháp này. Ngoài ra, bạn cũng có thể sử dụng các công thức khác để đọc dữ liệu ở từng ô trong mỗi dòng

Sử dụng phép lập chỉ mục toán học và số thứ tự của ô trên đối tượng của SqlDataReader

var id = [int] sqlDataReader[0];
var contactName = sqlDataReader[1] as string; 
var alias = sqlDataReader[2] as string;

Sử dụng tên trường trong phép lập chỉ mục toán học

var id = [int] sqlDataReader["Id"];
var contactName = sqlDataReader["ContactName"] as string;
var alias = sqlDataReader["Alias"] as string;

Cần lưu ý rằng, khi đọc dữ liệu từ SqlDataReader thì cần duy trì mở kết nối. Chỉ khi nào hoàn thành đọc dữ liệu thì mới đóng kết nối. Lý do là vì SqlDataReader không chứa bản sao cục bộ của dữ liệu. Nó chỉ là công cụ giúp đọc kết quả truy vấn

Thực hiện truy vấn INSERT – UPDATE – DELETE

Chúng ta xem xét tiếp tục thực hiện ba loại truy vấn INSERT – UPDATE – DELETE

Bước 1. Tạo thêm project P03_InsertUpdateDelete [Console App] trong solution

Bước 2. Viết mã như sau

using System;
using System.Data.SqlClient;
namespace P03_InsertUpdateDelete
{
    class Program
    {
        static void Main[string[] args]
        {
            Console.Title = "Insert - Update - Delete";
            var connectionString = @"Data Source=.;Initial Catalog=Contacts;Integrated Security=True";
            using [var connection = new SqlConnection[connectionString]]
            using [var command = new SqlCommand { Connection = connection }]
            {                
                connection.Open[];
                Console.WriteLine["Before inserting:"];
                Retrieve[command];
                var insertQuery = "INSERT INTO [dbo].[Contacts] [[ContactName], [Alias], [FirstName], [LastName], [DateOfBirth]] VALUES [N'George Bush', N'bush', N'Bush', N'George', N'2019-06-26 12:21:29']";
                command.CommandText = insertQuery;
                var count = command.ExecuteNonQuery[];
                Console.WriteLine[$"\r\n{count} record inserted!"];
                Console.WriteLine["\r\nAfter inserting:"];
                Retrieve[command];
                var updateQuery = "UPDATE [dbo].[Contacts] SET [ContactName] = 'George Jr. Bush' WHERE [ContactName] like '%Bush%'";
                command.CommandText = updateQuery;
                count = command.ExecuteNonQuery[];
                Console.WriteLine[$"\r\n{count} record updated!"];
                Console.WriteLine["\r\nAfter updating:"];
                Retrieve[command];
                var deleteQuery = "DELETE FROM [dbo].[Contacts] WHERE [ContactName] like '%Bush%'";
                command.CommandText = deleteQuery;
                count = command.ExecuteNonQuery[];                
                Console.WriteLine[$"\r\n{count} record deleted!"];
                Console.WriteLine["\r\nAfter deleting:"];
                Retrieve[command];
            }
            Console.ReadLine[];
        }
        static void Retrieve[SqlCommand command]
        {
            command.CommandText = "SELECT * FROM CONTACTS";
            var sqlDataReader = command.ExecuteReader[];
            if [sqlDataReader.HasRows]
            {
                while [sqlDataReader.Read[]]
                {
                    var id = [int]sqlDataReader["Id"];
                    var contactName = sqlDataReader["ContactName"] as string;
                    var alias = sqlDataReader["Alias"] as string;
                    Console.WriteLine[$"[{id}] {contactName} [{alias}]"];
                }
            }
            sqlDataReader.Close[];
        }
    }
}

Dịch và chạy chương trình sẽ thu được kết quả như sau

Như đã biết để thực hiện các loại truy vấn này, chúng ta sử dụng phương thức ExecuteNonQuery[] của SqlCommand. Phương thức này trả về số dòng chịu tác động của truy vấn tương ứng

Tham số trong truy vấn SQL, SqlParameter

Vấn đề tạo truy vấn từ người dùng dữ liệu

Trong các ví dụ trên, bạn đã biết cách thực hiện các truy vấn SQL cơ bản trong C#. Tuy nhiên, các truy vấn này đều là “tĩnh”, được “mã cứng”. Vì thế làm thế nào CHÈN một bản ghi mới vào cơ sở dữ liệu mà các giá trị do người dùng nhập?

Chắc hẳn bạn không thể nghĩ ngay ra giải pháp. Vì truy vấn SQL thực chất chỉ là một chuỗi văn bản [kiểu

using System;
using System.Data.SqlClient;
namespace P01_Scalar
{
    class Program
    {
        static void Main[string[] args]
        {
            Console.Title = "Retrieve scalar value";
            // lưu ý thay connectionString của mình
            var connectionString = @"Data Source =.\sqlexpress; Initial Catalog = Contacts; Integrated Security = True";
            // sử dụng cấu trúc using để connection tự động close sau khi kết thúc khối code
            using [var connection = new SqlConnection[connectionString]]
            {
                // truy vấn SQL
                var commandText = "SELECT COUNT[*] FROM CONTACTS";
                // khởi tạo object của lớp SqlCommand
                var command = new SqlCommand[commandText, connection];                
                // lưu ý phải mở kết nối trước khi thực thi truy vấn
                connection.Open[];
                // thực thi truy vấn để lấy kết quả scalar
                var count = [int]command.ExecuteScalar[];
                Console.WriteLine[$"{count} contacts found in the database"];
            }
            Console.ReadKey[];
        }
    }
}
1]. Do đó, cứ để người dùng nhập dữ liệu vào. Bạn sẽ sử dụng các chuỗi định dạng kỹ thuật để tạo truy vấn từ dữ liệu người dùng nhập. Ví dụ

________số 8

Tuy đơn giản nhưng đây là một giải pháp TỒI. in sao lại vậy?

Bất kỳ điều gì người dùng nhập vào thông qua các biến đều sẽ được đặt vào truy vấn SQL của bạn. Kể cả một chuỗi truy vấn khác cũng có thể được thêm vào chuỗi truy vấn của bạn. Cách làm này dẫn đến một lỗi bảo mật rất phổ biến. tiêm SQL

Do vậy, bạn KHÔNG BAO GIỜ đã sử dụng cách này để tạo chuỗi truy vấn. THỪA NHẬN. NET cung cấp một giải pháp. sử dụng tham số

Lớp SqlParameter – ví dụ minh họa

Để dễ hình dung, chúng ta cùng làm một ví dụ

using System;
using System.Data.SqlClient;
using System.Data;
namespace P04_Parameter
{
    class Program
    {
        static void Main[string[] args]
        {
            Console.Title = "Parameters";
            var connectionString = @"Data Source=.;Initial Catalog=Contacts;Integrated Security=True";
            while [true]
            {
                Console.WriteLine["Create new contact:"];
                Console.Write["Contact name: "];
                var contactName = Console.ReadLine[];
                Console.Write["First name: "];
                var firstName = Console.ReadLine[];
                Console.Write["Last name: "];
                var lastName = Console.ReadLine[];
                // Viết chuỗi truy vấn bình thường, tuy nhiên, ở vị trí nào cần tham số thì viết chữ @ trước tên tham số
                var query = "INSERT INTO [dbo].[Contacts] [[ContactName], [FirstName], [LastName], [DateOfBirth]] VALUES [@ContactName, @FirstName, @LastName, @DoB]";
                // Tạo các object SqlParameter để chứa tham số. Có nhiều overload khác nhau của hàm tạo
                // Lưu ý rằng, phần tên tham số của object phải trùng khớp với tên đã sử dụng trong query                
                var contactNameParam = new SqlParameter["ContactName", contactName];
                var firstNameParam = new SqlParameter["FirstName", firstName];
                // hoặc sử dụng cách khởi tạo dùng property
                var birthDayParam = new SqlParameter
                {
                    DbType = DbType.Date,
                    ParameterName = "DoB",
                    Value = DateTime.Now
                };
                using [var connection = new SqlConnection[connectionString]]
                using [var command = new SqlCommand { Connection = connection }]
                {
                    command.CommandText = query;
                    // lần lượt thêm từng object SqlParameter vào danh sách Parameters của command
                    command.Parameters.Add[contactNameParam];
                    command.Parameters.Add[firstNameParam]; 
                    command.Parameters.Add[birthDayParam];
                    // thậm chí có thể trực tiếp thêm cặp tham số - giá trị theo cách này mà không cần khai báo object riêng
                    command.Parameters.AddWithValue["LastName", lastName];
                    connection.Open[];
                    var count = command.ExecuteNonQuery[];
                    Console.WriteLine[$"{count} contact inserted!"];
                    Retrieve[command];
                }
                Console.ReadKey[];
            }
        }
        static void Retrieve[SqlCommand command]
        {
            command.CommandText = "SELECT * FROM CONTACTS";
            var sqlDataReader = command.ExecuteReader[];
            if [sqlDataReader.HasRows]
            {
                while [sqlDataReader.Read[]]
                {
                    var id = [int]sqlDataReader["Id"];
                    var contactName = sqlDataReader["ContactName"] as string;
                    var alias = sqlDataReader["Alias"] as string;
                    Console.WriteLine[$"[{id}] {contactName} [{alias}]"];
                }
            }
            sqlDataReader.Close[];
        }
    }
}

Dịch và chạy thử chương trình

Use SqlParameter

Qua ví dụ trên có thể thấy việc sử dụng tham số trong truy vấn Sql với SqlParameter rất đơn giản

  1. Trong truy vấn đặt tham số sẵn có ở những chỗ cần thiết;
  2. Khai báo các đối tượng SqlParameter và gán giá trị cho nó;
  3. Gán các đối tượng SqlParameter đã được tạo vào thuộc tính Các tham số của đối tượng SqlCommand

Khi bất kỳ thứ gì được đặt vào một tham số sẽ được coi là dữ liệu. SqlCommand sẽ đặt giá trị chính xác vào vị trí của tham số cho chúng ta cũng như sẽ thực hiện các thao tác xử lý phù hợp trợ giúp truy vấn an toàn

Cách viết placeholder cho các tham số có chút khác biệt giữa các nhà cung cấp. Máy chủ Sql sử dụng ký tự @, Oracle – dấu hai chấm. , OLEDB và ODBC sử dụng dấu chấm hỏi ?

Kết luận

Bài học này đã giúp bạn hiểu cách thức thực hiện truy vấn Sql trong C# và kỹ thuật đọc dữ liệu từ kết quả của các truy vấn. Bạn cũng nên lưu ý rằng, các kỹ thuật chúng tôi xem xét ở đây mang tính minh họa nhiều hơn là khả năng áp dụng thực tế. Các bài học thuộc phần này hướng tới việc giúp bạn hiểu nguyên lý của việc thiết lập chương trình với cơ sở dữ liệu từ C#, thay vì cách áp dụng

This is the end of the end of the content section on setting ADO ADO. BỌC LƯỚI

Nếu còn nhớ bài viết về kiến ​​trúc ADO. NET chắc chắn bạn sẽ thắc mắc tại sao không nói tiếp về DataAdapter, DataSet, DataTable, tức là các thành phần bị ngắt kết nối của ADO. BỌC LƯỚI. Lý do là bản thân Microsoft đã khuyến nghị không tiếp tục sử dụng DataSet và các lớp liên quan được xem là công nghệ cũ. Thay vào đó nên sử dụng Entity Framework – nội dung chính của bài giảng này

Nếu vậy thì tại sao vẫn học SqlConnection, SqlCommand, SqlParameter, SqlDataReader? . BỌC LƯỚI. Entity Framework của Bản thân phải sử dụng đến các thành phần này để làm việc với cơ sở dữ liệu

Trên thực tế, bạn có thể bắt đầu học thẳng Entity Framework. Tuy nhiên, công việc nắm giữ các thành phần của ADO. NET có tác dụng tốt hơn khi học và làm việc cùng Entity Framework. Nó giúp bạn hiểu rõ các vấn đề nằm sâu bên dưới Entity Framework và cách thức làm việc với cơ sở dữ liệu từ chương trình C#

Chủ Đề