2009-06-05 20 views
7

Tôi biết đã có rất nhiều câu hỏi ở đây về nội tuyến sql vs thủ tục được lưu trữ ... Tôi không muốn bắt đầu một số khác như thế! Điều này là về sql nội tuyến (hoặc động).Thực hành tốt nhất về định dạng nội tuyến sql bằng cách sử dụng ADO.NET trong C#

Tôi cũng biết điểm này đã trở nên ít nhiều tranh luận với LINQ to SQL và Entity Framework kế thừa của nó.

Nhưng ... giả sử bạn đã chọn (hoặc được yêu cầu bởi cấp trên của bạn) để làm việc với ADO.NET cũ và nội tuyến (hoặc động) sql. Vậy thì các phương pháp hay nhất cho việc này và định dạng sql là gì?

Điều tôi làm bây giờ là như sau: Tôi muốn tạo các câu lệnh SQL trong một thủ tục lưu sẵn trước. Điều này mang lại cho tôi màu cú pháp trong SQL Server Management Studio và khả năng kiểm tra truy vấn dễ dàng mà không cần phải thực hiện nó trong mã thông qua ứng dụng mà tôi đang phát triển.

Vì vậy, miễn là tôi đang thực hiện/gỡ lỗi, mã của tôi trông như thế này:

using (SqlConnection conn = new SqlConnection("myDbConnectionString")) 
    { 
     conn.Open(); 
     using (SqlCommand cmd = conn.CreateCommand()) 
     { 
      cmd.CommandType = CommandType.StoredProcedure; 
      cmd.CommandText = "myStoredProcName"; 
      // add parameters here 
      using (SqlDataReader rd = cmd.ExecuteReader()) 
      { 
       // read data and fill object graph 
      } 
     } 
    } 

Khi gỡ lỗi và thử nghiệm giai đoạn được thực hiện, tôi thay đổi mã trên như thế này:

using (SqlConnection conn = new SqlConnection("myDbConnectionString")) 
    { 
     conn.Open(); 
     using (SqlCommand cmd = conn.CreateCommand()) 
     { 
      cmd.CommandType = CommandType.Text; 
      cmd.CommandText = GetQuery(); 
      // add parameters here 
      using (SqlDataReader rd = cmd.ExecuteReader()) 
      { 
       // read data and fill object graph 
      } 
     } 
    } 

Và tôi thêm một phương thức riêng tư bổ sung, ví dụ GetQuery() trong đó tôi sao chép/dán toàn bộ khối các thủ tục lưu trữ như thế này:

private string GetQuery() 
    { 
     return @" 
    SET NOCOUNT ON; 
    SELECT col1, col2 from tableX where id = @id 

    -- more sql here 
     "; 
    } 

Làm việc như thế này có lợi ích mà tôi có thể phục hồi các mã một cách dễ dàng để gọi thủ tục lưu trữ một lần nữa nếu tôi phải debug/cập nhật mã sql sau đó, và sau khi nó được thực hiện tôi có thể dễ dàng đặt mã sql trở lại với sao chép/dán, mà không cần phải đặt dấu ngoặc kép xung quanh mỗi dòng và các công cụ như vậy.

Thực tiễn tốt có bao gồm dòng mới trong truy vấn không?
Có những thứ hay thủ thuật khác mà tôi chưa từng nghĩ đến có thể làm cho phương pháp này tốt hơn không?
Các bạn làm những việc như thế nào?
Hoặc tôi là người duy nhất vẫn sử dụng (phải sử dụng) nội tuyến sql?

+2

LINQ to SQL không ** "chính thức chết"; nó vẫn là một sản phẩm được hỗ trợ với sự phát triển liên tục; đơn giản, EF đang tập trung vào các tính năng mới. –

+0

xin lỗi đã được trích dẫn một cái gì đó tôi tìm thấy trong câu hỏi khác ở đây ... loại bỏ nó ;-) – fretje

Trả lời

7

Nội tuyến (có hoặc không có cú pháp chữ cái @"...") là tốt cho các truy vấn ngắn ... nhưng đối với bất kỳ điều gì dài hơn, hãy xem xét việc có tsql dưới dạng tệp trong dự án; hoặc dưới dạng tài nguyên được nhúng/resx hoặc dưới dạng tệp phẳng. Tất nhiên, ở giai đoạn đó, bạn có thể làm cho nó là một thủ tục được lưu trữ anyway ;-p

Nhưng có nó như là một tập tin riêng biệt buộc cùng một tách sẽ làm cho nó dễ dàng biến thành một thủ tục lưu trữ sau này (có lẽ chỉ thêm CREATE PROC v.v.).

Một vấn đề với nội tuyến - nó làm cho nó hấp dẫn đối với ai đó để nối đầu vào của người dùng ... điều này rõ ràng là xấu (bạn đã sử dụng đúng các tham số trong ví dụ).

+0

có thực sự, các tham số là một lý do khác để đặt tất cả mọi thứ trong một thủ tục lưu trữ đầu tiên ... Tôi không bao giờ nối sql! – fretje

+0

Tôi cũng nối đôi khi (để tuân theo nguyên tắc DRY) ... nhưng tôi không bao giờ nối nó với đầu vào của người dùng ;-) – fretje

+0

Nếu bạn đặt nó trong các tệp phẳng, làm cách nào để đưa nó vào lệnh? – fretje

2

Tôi đã sử dụng tệp tài nguyên .NET trong quá khứ. Chúng có ích cho việc lưu giữ một thư viện của tất cả các truy vấn được sử dụng trong một thư viện mã cụ thể, đặc biệt khi cùng một truy vấn có thể được sử dụng ở nhiều nơi (vâng, tôi nhận ra điều này cũng chỉ ra một số thiết kế kém, nhưng đôi khi bạn cần làm việc trong hộp cho bạn).

0

Ngoài câu lệnh SQL đơn dòng phi trival, tôi luôn tận dụng lợi thế đa dòng và làm cho nó một const

const string SelectMyTable = @" 
SELECT column_one 
    , column_two 
    , column_three 
    FROM my_table 
"; 

bài này cho phép tôi để cắt và dán cho người quản lý SQL để thử nghiệm.

Các vấn đề liên quan