2011-10-15 18 views
9

każdy jestem studentem i nowicjuszem w projektowaniu .NET, a szczególnie MVC3, ale dla jednego z moich projektów muszę nad nim pracować i przejść przez fazę uczenia się Problem i dezorientacja, z jakimi mam do czynienia to dotyczące DB-łączność, whast I leanree d Dokładnie dotyczące pobierania rekordów z bazy danych jest mniej więcej tak:Confused między SqlCommand i 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. 

Ale kiedy byłem sprawdzeniu MSDN Library okazało się, że SqlDataAdapter oferuje konstruktorów SqlDataAdapter (String, String), które bezpośrednio pobiera SelectCommand i ciąg połączenia, aby zainicjować w ten sposób pomijając rolę SqlCommand pomiędzy, jak to:

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

Wygląda krótko i ładnie, ale jestem zdezorientowany, że jeśli jest to możliwe w ten sposób, to dlaczego większość książek/nauczycieli przechodzi wcześniej (sposób SqlCommand).

  • Czym właściwie jest różnica między SqlCommand i SqlDataAdapter?
  • Która z metod jest lepsza Jedna lub dwie?
  • Obawiam się, że używam skrótu w metodzie drugiej, który może mieć wpływ na bezpieczeństwo lub wydajność?

Przepraszam z góry, jeśli brzmię bardzo nowicjusz lub rozmazany! Doceniam każdą pomoc, która może oczyścić moje koncepcje! Dziękuję Ci! :)

Odpowiedz

7

Errorstacks podsumował to prawo:

  • SqlAdapter jest używany do wypełnienia zestawu danych.
  • SqlCommand może być używany w dowolnym celu związanym z operacjami tworzenia/odczytu/aktualizacji/usuwania, wykonywania procedur przechowywanych i wielu innych.

Ponadto:

  • SqlCommand może mieć jedną dużą przewagę przed użyciem surowych ciągów w zakresie bezpieczeństwa - mogą chronić przed SQL injection. Po prostu użyj parametrów dla wartości podanych przez użytkownika zamiast ciągu.Format (...).

Moje osobiste preferencje to owinąć DOWOLNE ciągi sql w SqlCommand i dodać SqlParameters do niego, aby uniknąć Injection Sql przez szkodliwych użytkowników.
Jeśli chodzi o wykonanie dwóch podejść - nie oczekuję, że istnieje jakakolwiek różnica. (Jeśli ktoś może mi udowodnić, że się mylę - zrób to!).
Proponuję więc pozostać przy dłuższym wariancie 1 iw razie potrzeby użyć poleceń i parametrów.

Trochę notatki na stronie - zestawy danych i DataTables są nieco poza grą ze względu na Linq2Sql i Entity Framework.
Ale oczywiście znajomość zwykłych starych poleceń/Adaptery/Czytelników jest mile widziana :)

-6

Pośpiesz się! Skieruj swoją uwagę na LINQ !!!

Nie ma więcej takich rzeczy, jak SQLDataset lub TableAdapters, brak otwartego połączenia. Wszystko staje się płynniejsze dzięki LINQ.

LINQ próbki:

Dim wynik = z EMP w myDataContext.Employees gdzie emp.Salary> 10000 Wybierz emp.ID, emp.SurName, ....

myDatagrid.datasource = wynik .toList

z LINQ, nie trzeba się martwić o apostrofach lub CRLF w zapytaniach ...

a ty nawet intellisense na SQL tabele, kolumny i przedmiotów!

+0

To nie odpowiadało na pytanie. Ponadto czasami LINQ nie jest dostępny. Na przykład nie jest dostępny w wersji .NET CE przed wersją 3.5. –

Powiązane problemy