CommandType.Text vs CommandType.StoredProcedure

Есть ли какая-либо польза для явного использования CommandType StoredProcedure, а не только с помощью текстовой команды? Другими словами,

cmd = new SqlCommand("EXEC StoredProc(@p1, @p2)");
cmd.CommandType = CommandType.Text;
cmd.Parameters.Add("@p1", 1);
cmd.Parameters.Add("@p2", 2);

хуже, чем

cmd = new SqlCommand("StoredProc");
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@p1", 1);
cmd.Parameters.Add("@p2", 2);

ИЗМЕНИТЬ: Исправлено плохое копирование (снова). Кроме того, вся суть вопроса в отношении класса доступа к данным. Я бы скорее смог передать сохраненное имя и параметры proc в одной строке, а не дополнительные строки для каждого параметра.

Ответы

Ответ 1

Одна разница заключается в том, как происходит переполнение сообщений.

Где я работал, у нас было несколько пакетных процессов, которые бежали за ночь. Многие из них просто использовали запуск хранимой процедуры. Раньше мы планировали их использовать SQL-сервер, но отошли от него, чтобы вместо этого вызывать процедуры из программы .Net. Это позволило нам сохранить все запланированные задачи в одном месте, даже те, которые не имели никакого отношения к Sql Server.

Это также позволило нам создать более эффективные функции ведения журнала в программе. Net, которая вызывает процедуры, так что протоколирование из всех процессов overnight было согласованным. Хранимые процедуры будут использовать функции sql print и raiserror, и программа .Net получит и зарегистрирует их. Мы узнали, что CommandType.StoredProcedure всегда будет буферизовать эти сообщения в партиях около 50. Код .Net не будет видеть никаких событий журнала до тех пор, пока процедура не завершится или не сбросит буфер, независимо от того, какие параметры вы установили в соединении или что вы сделали это в своем sql. CommandType.Text зафиксировал это для нас.

Как побочная проблема, я бы использовал явные типы с вашими параметрами запроса. Давая возможность .Net попытаться сделать вывод о том, что типы параметров могут вызывать проблемы в некоторых ситуациях.

Ответ 2

Это чище.

Вы вызываете хранимую процедуру, почему бы просто не использовать CommandType.StoredProcedure?