MSDNドキュメントから:
「Prepareを呼び出す前に、準備するステートメントの各パラメータのデータタイプを指定します。可変長のデータタイプを持つ各パラメータについて、Sizepropertyを必要な最大サイズに設定する必要があります。これらの条件が満たされない場合、Prepareはエラーを返します。
Prepareを呼び出した後にExecuteメソッドを呼び出すと、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()) {
}
}
}
}