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)”

Xây dựng các đối tượng cơ sở dữ liệu với .NET Common Language Runtime (CLR) trong SQL 2005

Trong phiên bản 2005, môi trường thực thi của Microsoft .NET Framework (CLR) nay được chạy bên trong cơ sở dữ liệu. Môi trường thực thi này hỗ trợ việc việc xây dựng các đối tượng cơ sở dữ liệu dạng thủ tục, bao gồm hàm, thủ tục lưu trữ, trigger, được viết bằng các ngôn ngữ trên nền Microsoft.NET như C# hoặc VB.NET. Các ngôn ngữ trên nền .NET hỗ trợ nhiều đặc điểm mà trong ngôn ngữ T-SQL không có, cho phép xây dựng các đối tượng cơ sở dữ liệu phức tạp hơn. Các kiểu dữ liệu do người dùng định nghĩa và các aggregate (các tập hợp dữ liệu tổng hợp sẵn dùng trong Analysis Service) có thể được viết bằng một ngôn ngữ .NET để xây dựng các kiểu dữ liệu phức tạp hơn so với các phiên bản trước của SQL Server.

Continue reading “Xây dựng các đối tượng cơ sở dữ liệu với .NET Common Language Runtime (CLR) trong SQL 2005”

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)

C# 4.0: Đặt giá trị mặc nhiên cho tham số

Trong C# 4.0, bạn có thể khai báo và sử dụng các tham số tùy chọn, giống như trong ví dụ sau:

public static class OptionalDemoLib
{
   public static void SayHello(string s = “Hello World!”)
   {
      Console.WriteLine(s);
   }
}

Trong đó, tham số s có một giá trị mặc nhiên, khi đó bạn có thể gọi hàm SayHello mà có thể truyền giá trị cho nó hoặc không, trong trường hợp không truyền tham số, giá trị mặc nhiên sẽ được dùng:

public static class OptionalDemo
{
   public static void Main()
   {
      OptionalDemoLib.SayHello();
      OptionalDemoLib.SayHello(“Hello Bart!”);
   }
}

Nhớ rằng các tham số tùy chọn phải được đặt cuối danh sách tham số, nếu không bạn sẽ nhận được thông báo lỗi sau:

optlib.cs(3,58): error CS1737: Optional parameters must appear after all required parameters

Khai báo như trong ví dụ sau là không hợp lệ:

public static void SayHello(string s1 = “Hello World!”, string s2)

Khái niệm giá trị mặc nhiên này đã có từ lâu trong VB, nay cũng sẽ xuất hiện trong C#, điều này sẽ giúp chúng ta viết code một cách nhanh chóng hơn.

WPF ListView – Lấy đối tượng được click

Trong WPF, để lấy được đối tượng mà người dùng vừa click chuột trong một ListView, các bạn có thể làm như sau:

Đầu tiên bạn cần đăng ký hàm xử lý cho sự kiện nhấn chuột:

MyListView.MouseDoubleClick += new MouseButtonEventHandler(MyListView_MouseDoubleClick);
chú ý là bạn có thể đăng ký cho các hàm nhấn chuột khác như MouseLeftButtonDown, MouseRightButtonDown… và sau đó viết hàm xử lý sự kiện giống như sau:
void MyListView_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
   DependencyObject dep = (DependencyObject)e.OriginalSource;

   while ((dep != null) && !(dep is ListViewItem))
   {
       dep = VisualTreeHelper.GetParent(dep);
   }

   if (dep == null)
        return;

   MyDataItemType item = (MyDataItemType)MyListView.ItemContainerGenerator.ItemFromContainer(dep);

   // Do something with the item...
}
Cách chúng ta làm là đầu tiên, ta phải xác định đối tượng trực quan mà người dùng vừa nhấn chuột lên, từ đó chúng ta lần theo các đối tượng chứa nó cho đến khi tìm được một ListViewItem, và nhờ đó ta có thể tìm được đối tượng dữ liệu tương ứng. Nếu muốn lấy chỉ số thay vì đối tượng, dùng hàm IndexFromContainer().
Đoạn mã trên được viết trong VB.NET như sau:
Dim dep As DependencyObject = CType(e.OriginalSource, DependencyObject)
While ((dep IsNot Nothing) AndAlso Not (TypeOf (dep) Is System.Windows.Controls.ListViewItem))
    dep = VisualTreeHelper.GetParent(dep)
End While
If (dep Is Nothing) Then
    Return
End If
Dim item As MyDataItemType = CType(MyListView.ItemContainerGenerator.ItemFromContainer(dep), MyDataItemType)
Theo http://mikescodeblog.blogspot.com

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.