Когда я читал книги, чтобы изучить С# (может быть, некоторые старые книги Visual Studio 2005
), я столкнулся с советами всегда использовать SqlCommand.Prepare
каждый раз, когда я выполняю SQL-вызов (независимо от того, является ли его 'a SELECT
/UPDATE
или INSERT
в SQL Server 2005/2008), и я передаю ему параметры. Но действительно ли это?
-
Следует ли это делать каждый раз? Или просто иногда?
-
Имеет ли значение, передается ли один параметр или пять или двадцать?
-
Какой толчок он должен дать, если таковой имеется? Было бы заметно вообще (я использовал
SqlCommand.Prepare
здесь и пропустил его там, и у меня не было никаких проблем или заметных различий).
Ради вопроса, это мой обычный код, который я использую, но это скорее общий вопрос.
public static decimal pobierzBenchmarkKolejny(string varPortfelID, DateTime data, decimal varBenchmarkPoprzedni, decimal varStopaOdniesienia) {
const string preparedCommand = @"SELECT [dbo].[ufn_BenchmarkKolejny](@varPortfelID, @data, @varBenchmarkPoprzedni, @varStopaOdniesienia) AS 'Benchmark'";
using (var varConnection = Locale.sqlConnectOneTime(Locale.sqlDataConnectionDetailsDZP)) //if (varConnection != null) {
using (var sqlQuery = new SqlCommand(preparedCommand, varConnection)) {
sqlQuery.Prepare();
sqlQuery.Parameters.AddWithValue("@varPortfelID", varPortfelID);
sqlQuery.Parameters.AddWithValue("@varStopaOdniesienia", varStopaOdniesienia);
sqlQuery.Parameters.AddWithValue("@data", data);
sqlQuery.Parameters.AddWithValue("@varBenchmarkPoprzedni", varBenchmarkPoprzedni);
using (var sqlQueryResult = sqlQuery.ExecuteReader())
if (sqlQueryResult != null) {
while (sqlQueryResult.Read()) {
}
}
}
}
Дополнительные пояснения:
Если я перемещаю sqlQuery.Prepare()
, как в коде ниже, возникает исключение, что размер должен быть явно объявлен, что в основном приводит меня к мысли, что иметь sqlQuery.Prepare()
, как первый, делает его бесполезным? Может ли кто-нибудь показать правильное использование, используя мой пример?
public static decimal pobierzBenchmarkKolejny(string varPortfelID, DateTime data, decimal varBenchmarkPoprzedni, decimal varStopaOdniesienia) {
const string preparedCommand = @"SELECT [dbo].[ufn_BenchmarkKolejny](@varPortfelID, @data, @varBenchmarkPoprzedni, @varStopaOdniesienia) AS 'Benchmark'";
using (var varConnection = Locale.sqlConnectOneTime(Locale.sqlDataConnectionDetailsDZP)) //if (varConnection != null) {
using (var sqlQuery = new SqlCommand(preparedCommand, varConnection)) {
sqlQuery.Parameters.AddWithValue("@varPortfelID", varPortfelID);
sqlQuery.Parameters.AddWithValue("@varStopaOdniesienia", varStopaOdniesienia);
sqlQuery.Parameters.AddWithValue("@data", data);
sqlQuery.Parameters.AddWithValue("@varBenchmarkPoprzedni", varBenchmarkPoprzedni);
sqlQuery.Prepare();
using (var sqlQueryResult = sqlQuery.ExecuteReader())
if (sqlQueryResult != null) {
while (sqlQueryResult.Read()) {
}
}
}
}
Как мне это сделать? Добавляя .size рядом с параметрами и выполняя varPortfel.Lenght, если это строка и т.д.?