Cập nhật dữ liệu dùng Stored Procedure (LINQ to SQL phần 7)

Vài tuần trước tôi bắt đầu viết loạt bài về LINQ to SQL. LINQ to SQL là một bộ khung (framework) có sẵn cho O/RM (object relational mapping) trong .NET 3.5, nó cho phép bạn dễ dàng mô hình hóa các CSDL quan hệ dùng các lớp .NET. Bạn có thể dùng các biểu thức LINQ để truy vấn CSDL, cũng như có thể cập nhật/thêm/xóa dữ liệu từ đó.

Dưới đây là 6 phần đầu tiên của loạt bài này:

Trong phần 6 tôi đã nói tới cách chúng ta có thể dùng các Stored Procedure (SPROC) và các hàm do người dùng định nghĩa (UDF) để truy vấn và lấy dữ liệu về dùng mô hình dữ liệu  LINQ to SQL. Trong viết này, tôi sẽ nói về cách dùng các thủ tục này để cập nhật, thêm hoặc xóa dữ liệu.

Continue reading “Cập nhật dữ liệu dùng Stored Procedure (LINQ to SQL phần 7)”

LINQ tip #4: Dùng WHERE

Khi xây dựng các form tìm kiếm với SQL, chúng ta vẫn thường phải xây dựng một chuỗi SQL với nhiều điều kiện trong WHERE, theo kiểu như:

string sql = "select * from Customers";
string where = "";
if (txtCustomerName.Text != "")
    where += String.Format("CustomerName = {0}", txtCustomerName.Text);
if (where != "")
    sql += " WHERE " + where;

MyDataGrid.DataSource = ... <kết quả trả về bởi câu truy vấn>

Trong LINQ, nếu muốn xây dựng một câu truy vấn LINQ kiểu như vậy, bạn có thể sử dụng câu lệnh Where() kết hợp với biểu thức LAMBDA, với ví dụ trên tôi có thể viết như sau:

DataClasses1DataContext dc = new DataClasses1DataContext();
var q = from p in dc.Products select p;
if (txtCustomerName.Text != "")
    q = q.Where(p => p.Name != txtCustomerName.Text);
MyDataGrid.DataSource = q;

Lấy dữ liệu dùng Stored Procedure (LINQ to SQL phần 6)

Vài tuần trước tôi bắt đầu viết loạt bài về LINQ to SQL. LINQ to SQL là một bộ khung (framework) có sẵn cho O/RM (object relational mapping) trong .NET 3.5, nó cho phép bạn dễ dàng mô hình hóa các CSDL quan hệ dùng các lớp .NET. Bạn có thể dùng các biểu thức LINQ để truy vấn CSDL, cũng như có thể cập nhật/thêm/xóa dữ liệu từ đó.

Dưới đây là 5 phần đầu tiên của loạt bài này:

Trong các bài viết đó, tôi đã trình bài cách mà các bạn có thể dùng để lập trình lấy dữ liệu về từ CSDL.

Trong bài viết hôm nay, tôi sẽ cho thấy cách chúng ta có thể dùng các stored procedure (SPROCs) và các hàm do người dùng định nghĩa (UDFs) với mô hình dữ liệu LINQ to SQL. Bài viết này sẽ tập trung chủ yếu vào cách dùng SPROCs để truy vấn và lấy dữ liệu về từ CSDL. Trong bài viết kế tiếp, tôi sẽ hiển thị cách bạn có thể dùng các SPROCs để cập nhật, thêm, xóa dữ liệu từ CSDL.
Continue reading “Lấy dữ liệu dùng Stored Procedure (LINQ to SQL phần 6)”

Sử dụng asp:LinqDataSource (phần 5)

Trong các bài viết trước đây, tôi tập trung chủ yếu vào việc mô tả cách truy vấn và cập nhật dữ liệu dùng LINQ to SQL bằng cách lập trình.

Danh sách các bài viết trước có thể xem ở đây:

Trong bài viết này, tôi sẽ khám phá control mới <asp:LinqDataSource> có trong ASP.NET thuộc  phiên bản .NET 3.5. Control này là một datasource control mới cho ASP.NET (giống ObjectDataSource và SQLDataSource có trong ASP.NET 2.0) cho phép bạn khai báo việc gắn kết dữ liệu vào mô hình dữ liệu của LINQ to SQL cực kỳ dễ dàng.

Continue reading “Sử dụng asp:LinqDataSource (phần 5)”

Cập nhật cơ sở dữ liệu (LINQ to SQL phần 4)

Từ vài tuần trước, tôi đã bắt đầu một loạt bài nói về LINQ to SQL. LINQ to SQL là một O/RM có sẵn trong bản .NET Framework 3.5, và nó cho phép bạn dễ dàng mô hình hóa các CSDL cùng các lớp .NET. Bạn có thể dùng các biểu thức LINQ để truy vấn CSDL, cũng như để thêm/xóa/sửa dữ liệu.

Dưới đây là 3 bài đầu tiên trong loạt bài này:

Trong bài hôm nay, tôi sẽ nói rõ hơn về cách chúng ta dùng CSDL đã được mô hình hóa trước đây, và dùng nó để cập nhật, chỉnh sửa và xóa dữ liệu. Tôi cũng sẽ cho các bạn thấy các chúng ta có thể thêm các quy tắc (business rule – sau này trở đi tôi sẽ để nguyên từ business rule, vì từ này rõ nghĩa hơn) và tùy biến cách xác thực tính hợp lệ của dữ liệu. Continue reading “Cập nhật cơ sở dữ liệu (LINQ to SQL phần 4)”

Hỏi đáp LINQ

1. LINQ là gì ?

LINQ là một tập hợp các thành phần mở rộng cho phép viết các câu truy vấn dữ liệu ngay trong một ngôn ngữ lập trình, như C# hoặc VB.NET.

LINQ là từ viết tắt của “Language-Integrated Query”

2. Tôi cần có gì để lập trình LINQ ?

LINQ có từ bản .NET 3.5, vậy nên tối thiểu chương trình của bạn phải chạy trên nền tảng này.

Visual Studio 2008, hoặc các phiên bản Express của nó là các bộ công cụ phát triển tiêu biểu cho ứng dụng dùng LINQ.

Tải về Visual Studio 2008 tại đây.

Tải về Visual Studio Express tại đây.

3. LINQ và ADO.NET khác nhau chỗ nào ?

Nôm na, LINQ là tập mở rộng cho phép viết các câu truy vấn ngay trong các ngôn ngữ lập trình. Nó cho phép bạn làm việc với các kiểu tập hợp dữ liệu, như XML, collection, array,… và cả CSDL.

ADO.NET là công nghệ cho phép các ứng dụng có thể kết nối và làm việc với các loại CSDL khác nhau (truy vấn, cập nhật, thêm, xóa, gọi thủ tục…).

Bản thân LINQ không phải là một công nghệ được tạo ra để thay thế ADO.NET, bạn có thể làm việc với LINQ mà không dính gì đến CSDL. Tuy nhiên, LINQ to SQL, là một phần mở rộng của LINQ, cho phép bạn có thể làm việc được với CSDL SQL Server, trong trường hợp này thì khi viết bạn có thể bỏ qua các câu lệnh ADO.NET mà chỉ quan tâm tới cú pháp mà LINQ cung cấp.

Nhớ rằng dù bạn không hề dùng đến ADO.NET khi viết chương trình sử dụng LINQ to SQL, nhưng đằng sau nó, ADO.NET vẫn được dùng để thực hiện kết nối, gửi các câu lệnh, các lời gọi thủ tục…

4. LINQ có hỗ trợ Unicode không ?

Có, LINQ là một thành phần của .NET, và như vậy, LINQ hỗ trợ Unicode một cách hoàn toàn tự nhiên, bạn có thể làm các thao tác chèn, sửa dữ liệu với tiếng Việt mà không cần cấu hình thêm. Tất nhiên, khi thiết kế CSDL, bạn vẫn phải chọn kiểu dữ liệu (NVARCHAR) và collation phù hợp để LINQ có thể làm việc một cách đúng đắn.

5. Tôi không thể tìm thấy một số phương thức (Add, RemoveAll…) như các ví dụ trong loạt bài “LINQ to SQL”

Kể từ bản RTM, các phương thức dùng cho thêm và xóa entity đã được đổi tên, cụ thể như sau:

  • Add đổi thành InsertOnSubmit
  • AddAll đổi thành InsertAllOnSubmit
  • Remove đổi thành DeleteOnSubmit
  • RemoveAll đổi thành DeleteAllOnSubmit

6. LINQ và LINQ to SQL liên quan gì với nhau?

LINQ là một tập hợp các công nghệ cho phép bạn thay đổi cách truy xuất vào các nguồn dữ liệu ngay từ cấp độ ngôn ngữ, các câu truy vấn LINQ có dạng tương tự SQL. LINQ hỗ trợ hầu hết các dạng nguồn dữ liệu khác nhau, bao gồm cả các đối tượng trong bộ nhớ (LINQ to Objects), XML (LINQ to XML), CSDL SQL Server (LINQ to SQL)…

Như vậy LINQ to SQL là phần hỗ trợ việc truy cập vào CSDL SQL Server sử dụng LINQ.

7. So sánh LINQ to SQL với Entity Framework:

Bạn xem bài viết tại đây: https://namdh.wordpress.com/2010/06/30/comparing-linq-to-sql-and-ado-net-entity-framework/

8. Tôi muốn lập trình LINQ với các CSDL khác SQL Server thì phải làm thế nào?

Bạn có thể dùng LINQ với Oracle nhờ LINQ to Oracle: http://linqtooracle.codeplex.com/

Bạn cũng có thể tham khảo DbLinq Project: http://code2code.net/DB_Linq/

9. Biểu thức Lambda là gì?

Bạn có thể đọc bài viết về lambda tại đây: https://namdh.wordpress.com/2009/07/22/lambda-expression/

10. Tôi chỉ muốn trả về một tập giới hạn các cột cần thiết thì phải viết thế nào?

Thông thường, để trả về đối tượng chứa toàn bộ các cột trong bảng, bạn viết:

var r = from c in myContext.Customers select c;

Để lấy về một số cột cụ thể nào đó, bạn có thể viết:

var r = from c in myContext.Customers select new {c.Id, c.Name, c.Address};

Bạn cũng có thể dùng lại một lớp đã khai báo từ trước:

var r = from c in myContext.Customers select new CustomerInfo {Id = c.Id,  Name = c.Name, Address = c.Address};

11. Trong ví dụ trên, tôi thấy biến được khai báo bằng var, vậy var là gì?

Bạn có thể xem bài viết về từ khóa var tại đây: https://namdh.wordpress.com/2011/04/26/var-keyword/

12. Tôi muốn xem các ví dụ về LINQ to SQL, tôi có thể tìm ở đâu?

Bạn có thể tham khảo tại đây: http://msdn.microsoft.com/en-us/vbasic/bb688085.aspx

(đang cập nhật tiếp, nếu có thắc mắc, xin hãy để lại comment, những comment không liên quan sẽ bị xóa)

Lấy các dòng ngẫu nhiên (LINQ tip #3)

Trong SQL Server, để lấy về một tập kết quả ngẫu nhiên, bạn có thể viết:

SELECT TOP 5 * FROM myTable ORDER BY NEWID()

Trong LINQ, nếu muốn lấy về một tập kết quả ngẫu nhiên kiểu như trên, bạn cần tạo một hàm ngẫu nhiên, sau đó thêm nó vào LINQ designer, và dùng hàm đã tạo để sắp xếp. Các bước cụ thể như sau:

Continue reading “Lấy các dòng ngẫu nhiên (LINQ tip #3)”

Sử dụng thư viện LINQ Dynamic Query

LINQ (language integrated query) là một trong những tính năng mới được cung cấp cùng với VS 2008 và .NET 3.5. LINQ làm cho khái niệm truy vấn dữ liệu trở thành một trong những khái niệm cơ bản của lập trình .NET, và cho phép bạn sử dụng các câu truy vấn một cách hiệu quả trong ngôn ngữ lập trình bạn chọn.

LINQ tip #2

Khi thực hiện gắn nối dữ liệu vào DataSource của một DataGridView, đừng gắn nối trực tiếp đối tượng Table vào DataSource kiểu như sau:

MyDbContext db = new MyDbContext(); myGridView.DataSource = db.Products;

Nếu bạn viết như trên, trong trường hợp bạn thêm dữ liệu vào, dữ liệu trong DataGridView sẽ không tự động hiển thị dòng mới, thay vì vậy hãy dùng hàm GetNewBindingList():


myGridView.DataSource = db.Products.GetNewBindingList(); 

 
Để thêm một dòng mới, bạn có thể viết: ((IBindingList)myGridView.DataSource).Add(new MyData()); 
 

Dòng dữ liệu mới này sẽ được hiển thị trên DataGridView mà bạn không cần phải làm thêm bất kỳ thao tác nào.