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?
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. –
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