2011-10-15 115 views
9

mọi người tôi là sinh viên và mới với .NET và đặc biệt là phát triển MVC3 nhưng đối với một dự án của tôi, tôi đã nghiên cứu và thực hiện giai đoạn học tập Vấn đề và sự nhầm lẫn tôi đang gặp phải là liên quan đến DB-Khả năng kết nối, whast tôi leanree d liên quan đến lấy hồ sơ từ một cơ sở dữ liệu là một cái gì đó như thế này:Nhầm lẫn giữa SqlCommand & SqlDataAdapter

//Method One: 
var conn = new SqlConnection(conString.ConnectionString); 
const string cmdString = "Select * FROM table"; 
var cmd = new SqlCommand(cmdString, conn); 
var mySqlDataAdapter = new SqlDataAdapter(cmd); 
mySqlDataAdapter = new SqlDataAdapter(cmd); 
mySqlDataAdapter.Fill(myDataSet, "design"); 
// making a new SqlCommand object with stringQuery and SqlConnection object THEN a new SqlDataAdapter object with SqlCommand object and THEN filling up the table with the resulting dataset. 

Nhưng trong khi tôi đang kiểm tra MSDN Library tôi phát hiện ra rằng SqlDataAdapter cung cấp một nhà xây dựng SqlDataAdapter (string, string) trực tiếp mất một SelectCommand và một chuỗi kết nối để bắt đầu do đó bỏ qua vai trò của SqlCommand ở giữa, như sau:

//Method Two: 
var conn = new SqlConnection(conString.ConnectionString); 
const string cmdString = "Select * FROM table"; 
var mySqlDataAdapter = new SqlDataAdapter(cmdString, conn); 
mySqlDataAdapter.Fill(myDataSet, "design"); 

Trông ngắn và đẹp với tôi, Nhưng tôi bối rối ở đây rằng nếu điều này có thể theo cách này thì tại sao hầu hết sách/giáo viên đi trước đó (cách của SqlCommand).

  • Điều gì thực sự là sự khác biệt giữa SqlCommand và SqlDataAdapter?
  • Phương pháp nào tốt hơn một hoặc hai?
  • Tôi sợ rằng tôi đang sử dụng lối tắt trong phương pháp hai có thể ảnh hưởng đến bảo mật hoặc hiệu suất khôn ngoan?

Xin lỗi trước nếu tôi phát âm người mới chơi hoặc bị mờ! Sẽ đánh giá cao bất kỳ trợ giúp nào có thể xóa các khái niệm của tôi! Cảm ơn bạn! :)

Trả lời

7

Errorstacks tóm tắt nó ngay:

  • SqlAdapter được sử dụng để điền vào một tập dữ liệu.
  • SqlCommand có thể được sử dụng cho bất kỳ mục đích nào bạn có trong tâm trí liên quan đến các hoạt động Tạo/Đọc/Cập nhật/Xóa, thực hiện thủ tục được lưu trữ và hơn thế nữa.

Ngoài ra:

  • SqlCommand có thể có một lợi thế lớn đối với việc sử dụng các chuỗi liệu liên quan về an ninh - họ có thể bảo vệ bạn khỏi Sql Tiêm. Chỉ cần sử dụng các tham số cho các giá trị được cung cấp bởi người dùng thay vì string.Format (...).

Sở thích cá nhân của tôi là quấn BẤT K sq chuỗi sql trong SqlCommand và thêm SqlParameters vào nó để tránh Sql Injection bởi người dùng độc hại.
Về hiệu suất của hai phương pháp tiếp cận - tôi không mong đợi rằng có bất kỳ sự khác biệt nào. (Nếu ai đó có thể chứng minh cho tôi sai - hãy làm điều đó!).
Vì vậy, tôi khuyên bạn nên gắn bó với biến thể dài hơn 1 và sử dụng các lệnh cộng với các tham số nếu cần.

Một chút lưu ý phụ - Tập dữ liệu và DataTables gần đây một chút trong trò chơi do Linq2Sql và Entity Framework.
Nhưng tất nhiên, kiến ​​thức về SqlCommands/Adapters/Readers cũ được chào đón :)

-6

Nhanh lên! Chuyển sự chú ý của bạn sang LINQ !!!

Không có nội dung chi tiết nào khác như SQLDataset hoặc TableAdapters, không có kết nối mở. Mọi thứ trở nên mượt mà hơn với LINQ.

mẫu

LINQ:

kết quả mờ = từ EMP trong myDataContext.Employees nơi emp.Salary> 10000 Chọn emp.ID, emp.SurName, ....

myDatagrid.datasource = kết quả ToList

với LINQ, bạn không phải lo lắng về dấu nháy đơn hoặc CRLF trong truy vấn của bạn ...

và thậm chí bạn sẽ phải IntelliSense trên các bảng SQL, cột và các đối tượng!

+0

Điều đó không trả lời được câu hỏi. Hơn nữa, đôi khi LINQ không có sẵn. Ví dụ, nó không có sẵn trong phiên bản .NET CE trước phiên bản 3.5. –