Запутался между SqlCommand и SqlDataAdapter

все, я студент и новичок в .NET и особенно в разработке MVC3, но для одного из моих проектов мне нужно поработать над ним, и поэтому я прохожу фазу обучения. относительно извлечения записей из базы данных примерно так:

//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.

Но пока я проверял библиотеку MSDN, я обнаружил, что SqlDataAdapter предлагает конструкторы SqlDataAdapter(String, String), которые напрямую принимают SelectCommand и строку подключения для инициации, пропуская роль SqlCommand между ними, например:

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

Выглядит коротким и красивым для меня, но меня здесь смущает, что если это возможно таким образом, то почему большинство книг / учителей проходят раньше (путь SqlCommand).

  • В чем на самом деле разница между SqlCommand и SqlDataAdapter?
  • Какой метод лучше Один или Два?
  • Боюсь, что я использую ярлык во втором методе, который может повлиять на безопасность или производительность?

Заранее извиняюсь, если я звучу очень новичком или размыто! Буду признателен за любую помощь, которая могла бы прояснить мои концепции! Спасибо! :)


person Maven    schedule 15.10.2011    source источник


Ответы (2)


Errorstacks суммировал это правильно:

  • SqlAdapter используется для заполнения набора данных.
  • SqlCommand можно использовать для любых целей, связанных с операциями Create/Read/Update/Delete, выполнением хранимых процедур и многим другим.

Кроме того:

  • SqlCommand МОЖЕТ иметь одно большое преимущество перед использованием необработанных строк с точки зрения безопасности - они МОГУТ защитить вас от Sql-инъекций. Просто используйте параметры для значений, предоставленных пользователем, вместо string.Format(...).

Лично я предпочитаю оборачивать ЛЮБЫЕ строки sql в SqlCommand и добавлять к нему SqlParameters, чтобы избежать Sql Injection злоумышленниками.
Что касается производительности двух подходов, я не ожидаю, что есть какая-либо разница. (Если кто-то может доказать, что я не прав - сделайте это!).
Поэтому я бы посоветовал придерживаться более длинного варианта 1 и использовать команды плюс параметры, если это необходимо.

Небольшое примечание: наборы данных и таблицы данных в последнее время немного вышли из игры из-за Linq2Sql и Entity Framework.
Но, конечно, знание старых простых SqlCommands/Adapters/Readers приветствуется :)

person ViktorZ    schedule 15.10.2011

Торопиться! Обратите внимание на LINQ!!!

Больше никаких бабушек вроде SQLDataset или TableAdapters, никакого открытого соединения. С LINQ все становится проще.

Образец LINQ:

dim result = from emp в myDataContext.Employees, где emp.Salary > 10000 Выберите emp.ID, emp.SurName, ....

myDatagrid.datasource = результат.toList

С LINQ вам не нужно беспокоиться об одинарных кавычках или crlf в ваших запросах...

И вы даже получите интеллектуальное представление о таблицах, столбцах и объектах SQL!

person Didier Levy    schedule 15.10.2011
comment
Это не ответило на вопрос. Кроме того, иногда LINQ недоступен. Например, он недоступен в версии .NET CE до версии 3.5. - person Shaun Luttin; 11.09.2013