một vài thủ thuật lập trình c

71 290 0
một vài thủ thuật lập trình c

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Ngôn ngữ lập trình C là một ngôn ngữ mệnh lệnh được phát triển từ đầu thập niên 1970 bởi Dennis Ritchie để dùng trong hệ điều hành UNIX. Từ đó, ngôn ngữ này đã lan rộng ra nhiều hệ điều hành khác và trở thành một những ngôn ngữ phổ dụng nhất. C là ngôn ngữ rất có hiệu quả và được ưa chuộng nhất để viết các phần mềm hệ thống, mặc dù nó cũng được dùng cho việc viết các ứng dụng. Ngoài ra, C cũng thường được dùng làm phương tiện giảng dạy trong khoa học máy tính mặc dù ngôn ngữ này không được thiết kế dành cho người nhập môn.

Sử dụng DataAdapter DataSet Author : Xcross87 Ở trước bạn biết cách xử lý kết hình dùng Data Reader Chú ý : muốn xem thơng tin dùng Data Reader Bài hướng dẫn sử dụng DataSet để xử lý kết kết hợp với DataAdapter Không giống với DataReader, tạo đối tượng dùng interface System.DataIDataReader, DataSet thành phần đặc trưng ADO.NET sử dụng tất nhà cung cấp liệu (data provider) Dataset hồn tồn độc lập sử dụng kết nối ngắt kết nối khỏi nguồn Mục đích DataSet cung cấp xử lý xem xét liệu lưu trữ ‘memory cache’ Nếu DataSet không kết nối tới sở liệu mà xử lý liệu save lại vào database ? Đây lí mà DataAdapter đời Hãy nghĩ DataAdapter cầu nối DataSet Data Source Nếu khơng có DataAdapter DataSet khơng thể truy cập DataSource DataAdapter đảm bào việc kết nối truyền thơng tin cho DataSet Tìm hiểu ObjectModel Đầu tiên đưa số so sánh DataSet DataReader nhé, để bạn tránh hay hỏi nhiều việc : Lúc xài DataSet lúc xài DataReader, giống khác ? So sánh DataSet DataReader Nếu bạn đơn giản chi muốn lấy liệu trình bày thơi dùng DataReader Đặc biệt trường hợp mà bạn đọc với số lượng lớn liệu, ví vịng lặp tới hàng triệu dòng kết liệu, bạn muốn tốc độ đọc nhanh trình bày nhanh DataReader sử dụng cho mục đích này, NHANH TIỆN LỢI, cho việc ĐỌC liệu Nếu bạn muốn chỉnh sử liệu update thông tin liệu lại database bạn sử dụng DataSet DataAdapter lấp đầy (fill) liệu vào DataSet cách sử dụng DataReader, thêm vào resource cần lưu trữ vào để sử dụng ngắt kết nối Vì việc sử dụng DataSet tốn nhiều tài nguyên DataReader nhiều, bạn cần cân nhắc lúc sử dụng thành phần tốt, tránh lạm dụng Nếu bạn muốn đọc liệu viết dạng XML, export database schema, viết lại db dạng XML,… nên sử dụng DataReader Giới thiệu sơ qua DataSet DataSet ADO.NET bước phát triển lớn việc phát triển ứng dụng sở liệu đa hệ Khi lấy chỉnh sửa liệu, trì liên tục kết nối tới Data Source chờ user yêu cầu rõ ràng tốn tài nguyên máy nhiều DataSet giúp ích lớn Vì DataSet cho phép lưu trữ liệu chỉnh sửa ‘local cache’, hay gọi offline mode Có thể xem xét xử lý thơng tin ngắt kết nối Sau chỉnh sửa xem xong tạo kết nối update liệu từ local vào Data Source Dữ liệu DataSet lưu trữ dạng Collection Tables bạn cần phải xử lý thông qua lớp DataTable -> DataRow DataColumn Bảng kiến trúc DataSet Page of 71 Sử dụng DataAdapter DataSet Author : Xcross87 Giới thiệu DataAdapter Bạn cần tưởng tượng : bạn có bể nước (DataSource) , máy bơm (DataAdapter) thùng đựng nước (DataSet) Thì lấy nước dùng bơm lấy nước từ bể, kiểm tra lọc nước sau lại dùng bơm hút lại bể nước Đó vai trị bơm DataAdapter tương tự ^_^! Giải thích chuối :D Tương quan lớp : Page of 71 Sử dụng DataAdapter DataSet Author : Xcross87 Có cách tạo DataAdapter : [code] // Cách : Đơn giản khai báo tạo đối tượng Adapter SqlDataAdapter da = new SqlDataAdapter(); // Cách : Thiết lập đối tượng SqlCommand SqlDataAdapter da = new SqlDataAdapter(cmd); // Cách : Thiết lập query đối tượng SqlConnection SqlDataAdapter da = new SqlDataAdaoter(sql, conn); // Cách : Thiết lập query mệnh lệnh thực thi SqlDataAdapter da = new SqlDataAdapter(sql, connString); Giới thiệu DataTable thành phần kèm Nằm lớp : System.Data.DataTable Có cấu trúc theo cấu trúc bảng sở liệu gồm hàng cột nên có thành phần kèm theo : DataRow DataColumn DataRow tập hợp cột (record-set) Page of 71 Sử dụng DataAdapter DataSet Author : Xcross87 DataColumn tập hợp hàng đặc tính (Field) Ví dụ : [code] DataTable dt = new DataTable(); DataColumn col = dt.Columns[“Contact”]; // Cột Contact DataColumn col = dt.Columns[2]; DataRow row = dt.Rows[2]; [/code] Vậy đủ giới thiệu qua Bây vào vấn đề Làm việc với DataSet DataAdapter Tạo dataset : [code] DataSet ds = new DataSet(); DataSet ds = new DataSet(“DataSet Name”); [/code] Nếu bạn dùng cách theo mặc định DataSet có tên “NewDataSet”, cách thứ bạn đặt tên cho DataSet bên constructor Hoặc bạn có thẻ thay đổi tên DataSet thuộc tính ‘DataSetName’ Có nhiều cách xử lý với DataSet • • Sử dụng thông qua Adapter Đọc từ tài liệu XML Cách thứ đễ lúc khác Làm trước Thử xử lý liệu ví dụ : [code] using System; using System.Data; using System.Data.SqlClient; Page of 71 Sử dụng DataAdapter DataSet Author : Xcross87 namespace MSSQL_Server { class Database { static void Main(string[] args) { // Tạo connection strin string connString = @"Server = \SQLEXPRESS; Integrated Security = True; Database = Northwind"; // Tạo SQL query string sql = @"SELECT productname, unitprice FROM products WHERE unitprice < 20"; // Tạo connection SqlConnection conn = new SqlConnection(connString); try { // Mỏ kết nối conn.Open(); // Tạo Adapter SqlDataAdapter da = new SqlDataAdapter(sql, conn); // Tạo DataSet DataSet ds = new DataSet(); // Lấp đầy kết vào DataSet da.Fill(ds, "products"); // Tạo DataTable thu kết từ bảng DataTable dt = ds.Tables["products"]; // In kết Console foreach (DataRow row in dt.Rows) { foreach (DataColumn col in dt.Columns) Console.WriteLine(row[col]); Console.WriteLine("".PadLeft(20, '=')); } } catch (Exception e) { // Bắt lỗi Console.WriteLine(e.Message); } finally { // Đóng kết nối conn.Close(); } } } } [/code] Phân tích đơn giản nha Sau mở kết nối ta tạo Adapter Adapter chứa thông tin SQL query cần thực thi đối tượng kết nối conn, sau tạo DataSet Lúc DataSet chưa có Sau lấp đầy kết vào DataSet method ‘Fill’ Adapter Từ hiểu thêm : Adapter tự động thực thi câu Page of 71 Sử dụng DataAdapter DataSet Author : Xcross87 lệnh SQL , thu lấy kết gán hết vào DataSet Khác với DataReader cần có đối tượng SqlComnmand đễ xử lý Nếu lấp đầy kết vào DataSet mà khơng gán tên bảng tự động DataSet tên bảng ‘TableN’ với bảng Table, Table1,Table2…TableN Nếu query thực thi lại nhiều lần DataSet cập nhật thơng tin bảng vào Chú ý Adapter thay cách tạo Adapter : [code] // Tạo Adapter SqlDataAdapter da = new SqlDataAdapter(); da.SelectCommand = new SqlCommand(sql, conn); [/code] Thì kết thu giống hệt nhau, khơng có thay đổi DataSet chứa nhiều table xử lý Table cần phải gán vào DataTable tên table cụ thể Và cuối dùng DataColumn DataRow để xử lý DataTable Đó cách extract liệu từ DataSet Phân loại Sắp xếp DataSet Thử ví dụ : [code] using System; using System.Data; using System.Data.SqlClient; namespace MSSQL_Server { class Database { static void Main(string[] args) { // Tạo connection strin string connString = @"Server = \SQLEXPRESS; Integrated Security = True; Database = Northwind"; // Tạo SQL query string sql1 = @"SELECT * FROM customers "; string sql2 = @"SELECT * FROM products WHERE unitprice < 10 "; // Trộn query vào làm string sql = sql1 + sql2; // Tạo connection SqlConnection conn = new SqlConnection(connString); try { // Tạo Adapter SqlDataAdapter da = new SqlDataAdapter(); Page of 71 Sử dụng DataAdapter DataSet Author : Xcross87 da.SelectCommand = new SqlCommand(sql, conn); // Tạo lấp đầy DataSet DataSet ds = new DataSet(); da.Fill(ds, "customers"); // Lấy Data Table Collection DataTableCollection dtc = ds.Tables; // Xử lý Table thứ Console.WriteLine("Result from Customers table : "); Console.WriteLine("Company Name".PadRight(20) + "Contact Name".PadLeft(23) + "\n"); // Thiệt lập Filter string filter = "country = 'Germany'"; // Thiết lập Sort string sort = "companyname ASC"; // Hiển thị thông tin sort filter foreach (DataRow row in dtc["customers"].Select(filter, sort)) { Console.WriteLine("{0}\t{1}", row["companyname"].ToString().PadRight(20), row["contactname"]); } // Xử lý table thứ hai Console.WriteLine("\n -"); Console.WriteLine("Result from Products table"); Console.WriteLine("ProductName".PadRight(20) + "UnitPrice".PadLeft(21) + "\n"); // Hiển thị thông tin foreach (DataRow row in dtc[1].Rows) { Console.WriteLine("{0}\t{1}", row["productname"].ToString().PadRight(25), row["unitprice"]); } } catch (Exception e) { // Bắt lỗi Console.WriteLine(e.Message); } finally { // Đóng kết nối conn.Close(); } } } } Page of 71 Sử dụng DataAdapter DataSet Author : Xcross87 [/code] Hay nha…:D Code nhiều chỗ bị phong độ Chú ý cẩn thận Cố gắng nhớ tớ trình bày nè, rắc rối chút ^_^! Ở xử lý query sql1 sql2 chúng combine vào thành chuỗi query sql Adapter tạo thực thi query Vậy xử lý liệu ? Từ từ để sau Sau lấp đầy DataSet Chú ý cài : [code] da.Fill(ds, “customers”); [/code] Nhắc lại nào, query gọi liệu từ bảng : ‘customers’ ‘products’ Ở lấp đầy ‘customers’ Sau bạn xem đến hết code, khơng thấy lấp đầy thằng ‘products’ mà in kết bảng Vậy ? Cái phải hỏi xem thằng Fill làm việc Bây bạn thử chèn thêm xuống khối ‘try’ đoạn code sau để phân tích thằng Fill [code] Console.WriteLine(ds.Tables[0]); Console.WriteLine(ds.Tables[1]); [/code] Nghĩa in tên bảng DataSet Bạn thấy bảng ‘customers’ cịn bảng ‘customer1’ Sau bạn thử ‘foreach’ lấy hết kết customers1 check kết thu từ query vào bảng ‘products’ Từ suy luận cách làm việc Fill, ta nhớ lại DataSet lưu trữ loạt Tables, Fill Adapter lấp đầy tất kết từ Table vào DataSet Vậy sau query tables fill từ ‘customer’ đến ‘products’ với Table sau customer bị đổi tên thành ‘customerN’ hết Để muốn lấy lại tên ban đầu cho ‘products’ bạn cần thay đổi tên : [code] ds.Tables[1].TableName = “products”; [/code] Page of 71 Sử dụng DataAdapter DataSet Author : Xcross87 Chú ý query thực theo thứ tự nên bảng theo thứ tự Bây nghĩ hay nha [code] da.Fill(ds, “products”); [/code] Thay vào ? Bị lỗi : Object Reference is not an instance of an object Là ? Tức trỏ vào đối tượng bị NULL Tại bị NULL ? Thế này, theo thứ tự query ‘customers’ trước ‘products’ Cho nên Fill theo thứ tự Nghĩa phải fill Customers trỏ bắt đầu từ Tables[0] Ở ta bỏ qua ‘customers’ mà vào ‘products’ tức Table[1], khơng có trỏ tới Tables[0] Đây bị coi Exception NET Vì muốn xử lý products trước phải thay đổi thứ tự query tức : Sql = sql2 + sql1; Lúc Fill tên bảng ‘customers’ bị đổi thành ‘products1’ Ok Tiếp ! Lúc DataSet chứa nhiệu Table ta muốn lấy tất dùng DataTableCollection để thu lượm tât table DataSet Hoặc trình cao lấy theo index ds.Tables[int index] Bạn để ý tiếp có string tạo ‘filter’ ‘sort’ Đây dùng để lọc xếp liệu Vậy nguyên tắc làm ? Đơn giản bạn dùng lọc SQL, tức tạo chuỗi ‘filter’ ‘sort’ theo syntax viết câu SQL Có xem viết SQL tớ nha Trong table có Method Select(string filter, string sort) đễ lọc liệu xếp Ví dụ code tớ dùng Select DataTableCollection Nếu DataSet : ds.Tables[int index].Select(string filter, string sort); Nào, chưa hết hay nha, tiếp Hơm tienlbhoc có hỏi tớ : “ Tớ có đọc sách thấy sách dùng ví dụ, có Adapter Connection mà chẳng mở (open) connection mà chương trình chạy tốt, thế nhỉ? “ Page of 71 Sử dụng DataAdapter DataSet Author : Xcross87 Hì hì, vấn đề chỗ tớ viết máy bơm Cái máy bơm thông với bể, truyền nước không truyền nước máy bơm định Cũng bạn so sánh ví dụ trên, mở kết nối conn.Open() cịn ví dụ khơng cần mở Nhắc lại method Fill(), method đặc trưng ADO.NET cung cấp để truyền liệu DataSet TỰ ĐỘNG mở kết nối gọi kết nối khơng mở Và sau fill vào DataSet lại tự động đóng kết nối Mọi việc nằm quyền kiểm soát Adapter hết Bạn tự kiểm tra tình trạng kết nối State để xác minh Sử dụng DataView DataView dùng để xem thông tin liệu bảng, giống SQL view, thêm khơng giữ tí liệu Vi dụ : Sử dụng DataView [code] using System; using System.Data; using System.Data.SqlClient; namespace MSSQL_Server { class Database { static void Main(string[] args) { // Tạo connection strin string connString = @"Server = \SQLEXPRESS; Integrated Security = True; Database = Northwind"; // Tạo SQL query string sql = @"SELECT contactname, country FROM customers "; // Tạo connection SqlConnection conn = new SqlConnection(connString); try { // Tạo Adapter SqlDataAdapter da = new SqlDataAdapter(); da.SelectCommand = new SqlCommand(sql, conn); // Tạo lấp đầy DataSet DataSet ds = new DataSet(); da.Fill(ds, "customers"); // Lấy thông tin Table vào DataTable DataTable dt = ds.Tables["customers"]; // Tạo DataView DataView dv = new DataView(dt, "country = 'Germany'", "country", DataViewRowState.CurrentRows); // Hiển thị thông tin DataView foreach (DataRowView drv in dv) { for (int i = 0; i < dv.Table.Columns.Count; i++) Page 10 of 71 Sử dụng DataAdapter DataSet Author : Xcross87 [code] string connectionString = @"Server = \SQLEXPRESS; " + "User ID = sa; " + "Password = pete_87"; [/code] Ở : ‘sa’ tên mặc định cho system administrator ‘password’ tớ đặt Thông số tùy thuộc vào thơng số máy chủ cài đặt Bạn có system admin khơng xài password Lúc password mặc định (default) chuỗi rỗng (empty string) chuỗi kết nối bạn để tham số : Password =; Nhưng code tốt ^&^ Dưới bảng tham số truyền chuỗi kết nối, cung cấp thông tin kết nối tới máy chủ Name Application Name AttachDBFileNam e Connect timeout Data Source Alias 15 0-32767 None Servername or network address 8192 Encrypt Allowed Value Any string False Extended properties, initial file name Connection Timeout Server,Address, Network Address Default Value NET SqlClient Data Provider None True,false, Yes,no Any database that exists on server True,false,yes,no,ssp i Dbnmpntw, Dbmsrpcn, Dbmsadsn, Dbmsgnet, Dbmslpcn, Dbmslpcn, Dbmsspxn, Dbmssocn Multiple of 512 None Any string False True, false, yes, no Initial Catalog Database None Integrated security Trusted_connectio n Net False Network library Packet Size Password Persist Security PWD Dbmssocn Page 57 of 71 Any path Description Name of Application Full path of attachable database file Seconds to wait to connect Name of the target SQL Server instance Use SSL encryption Database name Authentication mode Network.dll Network packet size in bytes Password if not using win authen Sensitive info Sử dụng DataAdapter DataSet Author : Xcross87 Info User ID UID Workstation ID None Local Computer Name Anystring Ví dụ vài tham số kết nối : Data Source = \SQLEXPRESS Server = \SQLEXPRESS Address = \SQLEXPRESS Addr = \SQLEXPRESS Network Address = \SQLEXPRESS Chú ý : nói : \SQLEXPRESS tương đương với (local)\EXPRESS Thử áp dụng vào viết ứng dụng Console báo cáo thông tin kết nối Kết nối tới SQL Server dùng SqlConnection Dùng code mẫu sau : [code] using System; using System.Data; using System.Data.SqlClient; public class ThongTinKetNoi { static void Main() { // Connection string string connString = @"Server = \SQLEXPRESS; " + "Integrated Security = SSPI"; // Create connection SqlConnection conn = new SqlConnection(connString); try { // Open connection conn.Open(); Console.WriteLine("Connection opened."); Page 58 of 71 should be passed back after connecting Username if not using win authen Workstation connecting to SQL Server Sử dụng DataAdapter DataSet Author : Xcross87 // Display connection properties Console.WriteLine("Connection Properties:"); Console.WriteLine("\tConnection String: {0}",conn.ConnectionString); Console.WriteLine("\tDatabase: {0}",conn.Database); Console.WriteLine("\tDataSource: {0}",conn.DataSource); Console.WriteLine("\tServerVersion: {0}",conn.ServerVersion); Console.WriteLine("\tState: {0}",conn.State); Console.WriteLine("\tWorkstationId: {0}",conn.WorkstationId); } catch (SqlException e) { // Display error Console.WriteLine("Error: " + e); } finally { // Close connection conn.Close(); Console.WriteLine("Connection closed."); } } } [/code] Đọc qua code bạn hiểu code dùng Ở ghi thêm vài điều _Nếu kết nối bạn không rõ kết nối tới database mặc định database : master _Nếu muốn thay đổi database kết nối bạn thêm tham số ‘Database = db_name;’ vào chuỗi kết nối _Nếu bạn đưa vào database_name khơng tồn server gặp thơng báo lỗi : “System.Data.SqlClient.SqlException : Cannot open database ‘db_name’ requested by the login The login failed.” _Workstation định tên máy mà làm việc với máy chủ database máy kết nối tới thu kết tên máy Nếu mà bạn muốn tất máy kết nối tới máy chủ SQL có Workstation ID giống chuỗi kết nối (connection string) bạn thêm tham số cho Workstation ID Ví dụ : Workstation ID = Vo Danh Tieu Tot; Kết nối tới SQL Server dùng OleDbConnection Bạn nên đọc : ADO.NET tớ viết trước tham khảo Như viết đầu bài, kết nối ta luân chuyển nhà cung cấp kết nối để kết nối tới sở liệu Ví dụ kết nối tới SQL Server dùng lớp ‘SqlConnection’ Phần tương tự dùng lớp OleDbConnection để kết nối tới SQL Server Page 59 of 71 Sử dụng DataAdapter DataSet Author : Xcross87 [code] using System; using System.Data; using System.Data.OleDb; public class KetNoiDungOleDbConnection { static void Main() { // Connection string string connString = @"Provider = SqlOleDb; Data Source = \SQLEXPRESS; Integrated Security = SSPI"; // Create connection OleDbConnection conn = new OleDbConnection(connString); try { // Open connection conn.Open(); Console.WriteLine("Connection opened."); // Display connection properties Console.WriteLine("Connection Properties:"); Console.WriteLine("\tConnection String: {0}",conn.ConnectionString); Console.WriteLine("\tDatabase: {0}",conn.Database); Console.WriteLine("\tDataSource: {0}",conn.DataSource); Console.WriteLine("\tServerVersion: {0}",conn.ServerVersion); Console.WriteLine("\tState: {0}",conn.State); } catch (OleDbException e) { // Display error Console.WriteLine("Error: " + e); } finally { // Close connection conn.Close(); Console.WriteLine("Connection closed."); } } } [/code] Kết nối tới sở liệu không khó phức tạp địi hỏi kĩ biết cách vận dụng kết nối cách hợp lý, tránh hao tổn tài nguyên máy Kết thúc ‘tạo kết nối tới sở liệu Page 60 of 71 Sử dụng DataAdapter DataSet Author : Xcross87 thực thi sở liệu (database) Tạo mệnh lệnh (CREATING A COMMAND) Có nhiều cách ngồi cách sử dụng SqlCommand dùng cách để làm ví dụ cung cấp tốt việc liên kết với sở liệu SQL Mở Visual C# chọn Console Application dùng thử code sau để phân tích : [code] using System; using System.Data; using System.Data.SqlClient; class MenhLenh { public static void Main() { // tạo kết nối SqlConnection conn = new SqlConnection(@"Server = \SQLEXPRESS; Integrated Security = True; Database = Northwind"); // tạo đối tượng giữ lệnh cần thực thi SqlCommand cmd = new SqlCommand(); Console.WriteLine("Command created."); try { // mở kết nối conn.Open(); } catch (SqlException e) { Console.WriteLine(e.ToString()); } finally { // đóng kết nối conn.Close(); Console.WriteLine("Connection Closed."); } } } [/code] Bài xác giới thiệu dùng làm ví dụ trước ‘Tạo kết nối tới sở liệu’ khơng nói thêm phần đóng/mở kết nối tới hệ quản trị sở liệu Chỉ khác chỗ có thêm dịng code tạo thêm mệnh lệnh : [code] // tạo đối tượng giữ lệnh cần thực thi SqlCommand cmd = new SqlCommand(); Page 61 of 71 Sử dụng DataAdapter DataSet Author : Xcross87 Console.WriteLine("Command created."); [/code] Ở thông qua lớp ‘SqlCommand’ tạo đối tượng để nắm giữ thơng tin lệnh Sau tạo xong thơng báo Console “Command created.” Chương trình đơn giản dễ hiểu Đó cách tạo đối tượng nắm giữ mệnh lệnh Mệnh lệnh tạo có tác dụng KHI VÀ CHỈ KHI định thực thi kết nối Vì phải cho kèm với kết nối tồn để tạo thi hành mệnh lệnh viết Ví dụ sau minh họa gán mệnh lệnh vào kết nối [code] using System; using System.Data; using System.Data.SqlClient; class MenhLenh { public static void Main() { // tạo kết nối SqlConnection conn = new SqlConnection(@"Server = \SQLEXPRESS; Integrated Security = True; Database = Northwind"); // tạo đối tượng giữ lệnh cần thực thi SqlCommand cmd = new SqlCommand(); Console.WriteLine("Command created."); try { // mở kết nối conn.Open(); // gán mệnh lệnh vào kết nối cmd.Connection = conn; Console.WriteLine("Connected command to connection !"); } catch (SqlException e) { Console.WriteLine(e.ToString()); } finally { // đóng kết nối conn.Close(); Console.WriteLine("Connection Closed."); } } } [/code] Bạn dễ thấy ví dụ ví dụ ban đầu có thay đổi thêm chút khối lệnh ‘try’ Page 62 of 71 Sử dụng DataAdapter DataSet Author : Xcross87 [code] // gán mệnh lệnh vào kết nối cmd.Connection = conn; Console.WriteLine("Connected command to connection !"); [/code] Sau tạo kết nối tới sở liệu đối tượng nắm giữ mệnh lệnh thi hành bên dướ thử gán mệnh lệnh với kết nối Trong đối tượng mệnh lệnh có thuộc tính (properties) để gán vào kết nối : CommandObject.Connection = ConnectionObject; Như sau gán kết nối xong Console thơng báo kết gán mệnh lệnh vào kết nối thành công Câu hỏi đặt : Tại không gán kết nối tạo đối tượng kết nối mà phải cho vào khối ‘try catch finally’ làm ? Câu trả lời dễ hiểu: Bạn thử nghĩ xem sau bạn tạo kết nối muốn kích hoạt kiểm tra kết nối có tốt hay khơng phải ném vào khối ‘try catch’ Giả sử mà bạn khai báo gán mệnh lệnh trước khối ‘try catch’ kết nối thành cơng khơng có lỗi Nhưng trường hợp có lỗi biến cố bất ngờ xảy gán mệnh lệnh vào kết nối có lỗi chương trình ngưng hoạt động tình trạng treo mà tiêu thụ tài ngun máy, lãng phí Vì mà tốt gán khối ‘try catch’ sau mở kết nối để gặp lỗi ta biết lỗi nguyên nhân gây lỗi sửa (debug).Giải thích khơng biết có hiểu khơng ^_^! Tuy nhiên bạn chắn kết nối đảm bảo tốt bạn gán mệnh lệnh vào kết nối từ đầu rút ngắn lại code [code] SqlCommand cmd = conn.CreateCommand(); [/code] Tương đương với dòng code [code] SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; [/code] Bạn tạo đối tượng nắm giữ mệnh lệnh gán vào kết nối, phải viết mệnh lệnh cho đối tượng Page 63 of 71 Sử dụng DataAdapter DataSet Author : Xcross87 Ta dùng thuộc tình ‘CommandObject.CommandText’ để tạo lệnh cần thực thi với sở liệu Bạn dùng code thay đổi phần code khối ‘try catch’ phần code : [code] try { // mở kết nối conn.Open(); // gán mệnh lệnh vào kết nối cmd.Connection = conn; Console.WriteLine("Connected command to connection !"); // tạo lệnh cho đối tượng cmd.CommandText = @" SELECT count(*) FROM Employees "; Console.WriteLine(" Ready to execute SQL command : {0} ", cmd.CommandText); } [/code] Bạn để ý tớ có thêm dịng code khác bên ‘CommandText’ lệnh SQL, bạn viết khác câu lệnh SQL có lỗi thơng báo thực thi lệnh này, đoạn trick mà bạn không thông thạo cấu trúc câu lệnh SQL Xem ‘Cơ SQL cho người bắt đầu’ để biết chút ban đầu SQL Thực thi mệnh lệnh (EXECUTING COMMAND) Bây thử thực thi câu lệnh xem kết Nhưng thực thi lệnh kết cho khác bạn sử dụng phương thức thực thi (execution method) khác Có cách thực thi lệnh theo bảng sau : Phương thức (Method) ExecuteNonQuey() ExecuteScalar() ExecuteReader() ExecuteXmlReader Giá trị trả (Return Value) Khơng trả khơng phải query Một giá trị Không nhiều hàng XML À bạn hiểu query biểu thức có giá trị trả Bây tớ dùng ‘ExecuteScalar’ để thu giá trị lấy [code] using System; using System.Data; Page 64 of 71 Sử dụng DataAdapter DataSet Author : Xcross87 using System.Data.SqlClient; class MenhLenh { public static void Main() { // tạo kết nối SqlConnection conn = new SqlConnection(@"Server = \SQLEXPRESS; Integrated Security = True; Database = Northwind"); // tạo đối tượng giữ lệnh cần thực thi SqlCommand cmd = new SqlCommand(); Console.WriteLine("Command created."); try { // mở kết nối conn.Open(); // gán mệnh lệnh vào kết nối cmd.Connection = conn; Console.WriteLine("Connected command to connection !"); // tạo lệnh cho đối tượng cmd.CommandText = @"SELECT count(*) FROM Employees "; Console.WriteLine("Ready to execute SQL command : {0} ", cmd.CommandText); // Thực thi câu lệnh Console.WriteLine("Number of Employees is {0} ", cmd.ExecuteScalar()); } catch (SqlException e) { Console.WriteLine(e.ToString()); } finally { // đóng kết nối conn.Close(); Console.WriteLine("Connection Closed."); } } } [/code] Ở bạn thu kết : ‘Number of Employees is 9’ Bạn học thêm câu lệnh SQL ln Để đếm số dịng (rows) bảng ta dùng tham số ‘count(*)’ Cách gọi : [code] Page 65 of 71 Sử dụng DataAdapter DataSet Author : Xcross87 SELECT count(*) FROM [/code] Giá trị trả kiểu ‘Object’ có kết nên sử dụng ‘ExecuteScalar’ Bạn nên ý : ‘ExecuteScalar’ trả kiểu ‘Object’ môi trường NET Framework sở liệu chứa kiểu liệu Khi đưa Console dùng ‘WriteLine’ tất kiểu bị convert sang kiểu kí tự in hình hết Bạn chuyển giá trị thu kiểu convert khơng hợp lệ có ‘Runtime Error : Invaliad type cast’ hay Mình giả sử muốn giá trị thu kiểu ‘Int’ code sau : [code] int count = (int)cmd.ExecuteScalar(); Console.WriteLine(“ Number of Employees is {0} “, count); [/code] Nếu dùng thêm code convert thay đổi câu lệnh thực thi (commandText) thành : [code] cmd.CommandText = “SELECT firstname FROM employees WHERE lastname = ‘Davolio’ [/code] Thì với ExecuteScalar() trả kiểu Object có giá trị “Nancy” thực chất kiểu String (C#) mà bạn lại cast sang kiểu ‘Int’ hình thơng báo lỗi sau Unhandled Exception : System.InvalidCastException: Specified cast is not valid Kiểu ‘String’ bị convert sang kiểu ‘Int’ Bây thực câu lệnh thu nhiều kết xem Tất nhiên sử dụng : ExecuteReader() [code] using System; using System.Data; using System.Data.SqlClient; class MenhLenh { public static void Main() Page 66 of 71 Sử dụng DataAdapter DataSet Author : Xcross87 { // tạo kết nối SqlConnection conn = new SqlConnection(@"Server = \SQLEXPRESS; Integrated Security = True; Database = Northwind"); // tạo đối tượng giữ lệnh cần thực thi SqlCommand cmd = new SqlCommand(); Console.WriteLine("Command created."); try { // mở kết nối conn.Open(); // gán mệnh lệnh vào kết nối cmd.Connection = conn; Console.WriteLine("Connected command to connection !"); // tạo lệnh cho đối tượng cmd.CommandText = @"SELECT firstname, lastname FROM Employees "; Console.WriteLine("Ready to execute SQL command : {0} ", cmd.CommandText); // Thực thi câu lệnh SqlDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { Console.WriteLine(" Employee name : {0} {1} ", reader.GetValue(0), reader.GetValue(1)); } reader.Close(); } catch (SqlException e) { Console.WriteLine(e.ToString()); } finally { // đóng kết nối conn.Close(); Console.WriteLine("Connection Closed."); } } } [/code] Ở ta dùng query đẻ lấy họ tên bảng Employees Và phương thức : ExecuteReader() trả giá trị đối tượng SqlDataReader Vì tớ tạo đối tượng SqlDataReader reader để thu nhận tất kết lấy dược từ database Kết theo dịng (row) lần đọc ‘reader.Read()’ chứa giá trị có từ bảng theo dịng chi nắm giữ thông tin lấy tất cột có bảng Ví dụ tớ lấy cột họ tên hàng reader Read() có value tương ứng với Value(1) họ Value(0) tên Nếu mà bạn GetValue(i) với i khác chương trình treo Phương thức Read() sau lần Page 67 of 71 Sử dụng DataAdapter DataSet Author : Xcross87 thực trả hàng Do dó để đọc hết kết thu tớ dùng vòng lặp ‘while’ đọc khơng cịn hàng thơi Để thực thi biểu thức ta sử dụng : ExecuteNonQuery() Đơn giản biểu thức chẳng trả giá trị Ví dụ bên minh họa cách dùng : [code] using System; using System.Data; using System.Data.SqlClient; public class ThiHanhMenhLenh { public static void Main() { SqlConnection conn = new SqlConnection(@"Server = \SQLEXPRESS; Integrated Security = True; Database = Northwind"); string querySelect = @"SELECT count(*) FROM Employees"; string queryInsert = @"INSERT INTO Employees (firstname,lastname) VALUES ('Pete','Houston')"; string queryDelete = @"DELETE FROM Employees WHERE firstname = 'Pete' AND lastname = 'Houston'"; SqlCommand cmdSelect = new SqlCommand(querySelect, conn); SqlCommand cmdInsert = new SqlCommand(queryInsert, conn); SqlCommand cmdDelete = new SqlCommand(queryDelete, conn); try { conn.Open(); Console.WriteLine("Open connection !"); Console.WriteLine("Before INSERT : "); Console.WriteLine(" Number of employees : {0} ", cmdSelect.ExecuteScalar()); cmdInsert.ExecuteNonQuery(); Console.WriteLine("Insert complete !"); Console.WriteLine("After INSERT : "); Console.WriteLine(" Number of employees : {0} ", cmdSelect.ExecuteScalar()); cmdDelete.ExecuteNonQuery(); Console.WriteLine("Delete complete !"); Console.WriteLine("After DELETE : "); Console.WriteLine(" Number of employees : {0} ", cmdSelect.ExecuteScalar()); } catch (SqlException sqle) { Console.WriteLine(sqle.ToString()); Page 68 of 71 Sử dụng DataAdapter DataSet } Author : Xcross87 } finally { conn.Close(); Console.WriteLine("Close connection !"); } } [/code] Như bạn thấy tạo hai đối tượng cmdInsert cmdDelete dùng để thực thi hai biểu thức thi hành xóa chèn thêm giá trị vào bảng, mà khơng có giá trị trả dùng ExecuteNonQuery Việc thực thi mệnh lệnh khơng có khó khăn phụ thuộc vào mục đích sử dụng bạn để thu kết cần tìm Tham số truyền vào lệnh (COMMAND PARAMETERS) Nhiều lúc mà code ấy, muốn thay đổi mệnh lệnh phải thay đổi CommandText….Nếu code không linh đông, muốn thay đổi thực thi câu lệnh muốn lám May thay NET Framework có hỗ trợ tham số truyên vào lệnh biểu thức SQL ta thay đổi thơng tin cần thiết CommandText Nếu thủ công lao động chân tay theo kiểu : [code] String fname = “Pete”; String lname = “Houston”; String value = “(‘” + fname + “’,” + “’” + lname + “’)”; String queryInsert = @” INSERT INTO Employees (firstname, lastname) VALUES ” + value; [/code] Nhưng mà kiểu khác làm trên, nhìn code lại hoa mắt Cách tốt làm việc với tham số truyền SQL Trong câu lệnh SQL tham số kí hiệu với dấu @ trước Ví dụ với câu lệnh INSERT : [code] INSERT INTO MyTable VALUES (@MyName, @MyNumber) [/code] OK ! Thử làm xem Dưới code minh họa Page 69 of 71 Sử dụng DataAdapter DataSet Author : Xcross87 [code] using System; using System.Data; using System.Data.SqlClient; public class ThiHanhMenhLenh { public static void Main() { SqlConnection conn = new SqlConnection(@"Server = \SQLEXPRESS; Integrated Security = True; Database = Northwind"); string fname = "Pete"; string lname = "Houston"; string querySelect = @"SELECT firstname, lastname FROM Employees WHERE EmployeeID > 9"; string queryInsert = @"INSERT INTO Employees (firstname,lastname) VALUES (@fname,@lname)"; SqlCommand cmdSelect = new SqlCommand(querySelect, conn); SqlCommand cmdInsert = new SqlCommand(queryInsert, conn); cmdInsert.Parameters.Add("@fname", SqlDbType.NVarChar, 10); cmdInsert.Parameters.Add("@lname", SqlDbType.NVarChar, 20); try { conn.Open(); Console.WriteLine("Open connection !"); cmdInsert.Parameters["@fname"].Value = fname; cmdInsert.Parameters["@lname"].Value = lname; cmdInsert.ExecuteNonQuery(); SqlDataReader reader = cmdSelect.ExecuteReader(); while (reader.Read()) { Console.WriteLine(" New Employee : {0} {1} ", reader.GetValue(0), reader.GetValue(1)); } reader.Close(); } catch (SqlException sqle) { Console.WriteLine(sqle.ToString()); } finally { conn.Close(); Console.WriteLine("Close connection !"); } } } [/code] Page 70 of 71 Sử dụng DataAdapter DataSet Author : Xcross87 Đầu tiên ta khai báo tham số truyền vào chuôi lệnh thực thi SQL : [code] cmdInsert.Parameters.Add("@fname", SqlDbType.NVarChar, 10); cmdInsert.Parameters.Add("@lname", SqlDbType.NVarChar, 20); [/code] Sau truyền vào giá trị cần thực tham số : [code] cmdInsert.Parameters["@fname"].Value = fname; cmdInsert.Parameters["@lname"].Value = lname; [/code] Chú ý lần thực xong lệnh bạn phải truyền lại CommandText khơng lệnh khơng có hiệu lực Nhưng bất tiện phương thức tạo để thi hành lệnh nhiều lần : CommandObject.Prepare() Nhưng mà thay đổi CommandText phương thức prepare() hiệu lực Kết thúc ‘Thực thi mệnh lệnh với sở liệu’ Bài : ‘Đọc liệu với Data Readers’ Các bạn xem index mục lục để xem chi tiết viết Page 71 of 71 ... @”dsn=northwindodbc”; … OdbcConnection conn = null; OdbcDataReader reader = null; … conn = new OdbcConnection(connString); conn.Open(); OdbcCommand cmd = new OdbcCommand(sql, conn); [/code] Page 38... BY C? ??u tr? ?c : [code] ORDER BY [ASC | DESC] {, n} • • ASC : Ascending DESC : Descending Nếu bạn khơng c? ? ASC hay DESC m? ?c định (default) ASC Query chung mẫu : [code] SELECT ... nối conn = new SqlConnection(connString); conn.Open(); //Th? ?c thi query SqlCommand cmd = new SqlCommand(sql, conn); reader = cmd.ExecuteReader(); // In kết Console.WriteLine( "Chương trình thể c? ?ch

Ngày đăng: 23/11/2014, 01:14

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan