От документацията на MSDN:
„Преди да извикате Prepare, посочете типа данни на всеки параметър в инструкцията, която трябва да се подготви. За всеки параметър, който има тип данни с променлива дължина, трябва да зададете Sizeproperty на максималния необходимия размер. Prepare връща грешка, ако тези условия не са изпълнени.
Ако извикате метод Execute след извикване на Prepare, всяка стойност на параметъра, която е по-голяма от стойността, определена от свойството Size, автоматично се съкращава до първоначалния посочен размер на параметъра и не се връщат грешки при съкращаване.
Изходните параметри (независимо дали са подготвени или не) трябва да имат зададен от потребителя тип данни. Ако посочите тип данни с променлива дължина, трябва да посочите и максималния размер."
Освен това, "Ако CommandTypeproperty е настроен на TableDirect, Prepare не прави нищо. Ако CommandType е зададен на StoredProcedure, извикването наPrepare трябва да успее, ..."
Това като цяло се използва, за да се гарантира, че крайният потребител не използва техника на SQL инжектиране за добавяне или премахване на информация, която не желаете и от базата данни.
Разгледах го и разгледах тази статия http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.prepare.aspx. Вашият проблем е, че трябва да дефинирате параметрите си, преди да стартирате .Prepare() и след това да зададете параметрите си, след като стартирате .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.Add("@varPortfelID");
sqlQuery.Parameters.Add("@varStopaOdniesienia");
sqlQuery.Parameters.Add("@data");
sqlQuery.Parameters.Add("@varBenchmarkPoprzedni");
sqlQuery.Prepare();
sqlQuery.ExecuteNonQuery();//This might need to be ExecuteReader()
sqlQuery.Parameters[0].Value = varPortfelID;
sqlQuery.Parameters[1].Value = varStopaOdniesienia;
sqlQuery.Parameters[2].Value = data;
sqlQuery.Parameters[3].Value = varBenchmarkPoprzedni;
using (var sqlQueryResult = sqlQuery.ExecuteReader())
if (sqlQueryResult != null) {
while (sqlQueryResult.Read()) {
}
}
}
}