Từ Tài liệu MSDN:
"Trước khi bạn gọi Chuẩn bị, hãy chỉ định loại dữ liệu của từng tham số trong câu lệnh cần chuẩn bị. Đối với mỗi thông số có loại dữ liệu độ dài thay đổi, bạn phải đặt Sizeproperty thành kích thước tối đa cần thiết. Chuẩn bị trả về lỗi nếu các điều kiện không được đáp ứng.
Nếu bạn gọi một phương thức Thực thi sau khi gọi Chuẩn bị, bất kỳ giá trị tham số nào lớn hơn giá trị được chỉ định bởi thuộc tính Kích thước sẽ được tự động cắt ngắn thành kích thước đã chỉ định ban đầu của tham số và không có lỗi cắt ngắn nào được trả về.
Các tham số đầu ra (dù được chuẩn bị hay không) phải có kiểu dữ liệu do người dùng chỉ định. Nếu bạn chỉ định loại dữ liệu độ dài thay đổi, bạn cũng phải chỉ định Kích thước tối đa của chúng. "
Hơn nữa, "Nếu CommandTypeproperty được đặt thành TableDirect, thì Chuẩn bị không làm gì cả. Nếu CommandTypeis được đặt thành StoredProcedure, thì lệnh gọi tớiPrepare sẽ thành công, ..."
Nói chung, điều này được sử dụng để đảm bảo rằng người dùng cuối không sử dụng kỹ thuật SQL Injection để thêm hoặc xóa thông tin mà bạn cũng không muốn chúng khỏi cơ sở dữ liệu.
Tôi đã xem xét nó và xem bài viết này http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.prepare.aspx. Vấn đề của bạn là bạn cần xác định các tham số của mình trước khi chạy .Prepare () và sau đó đặt các tham số của bạn sau khi bạn chạy .Prepare (). Ngay bây giờ bạn đang làm cả hai trước đây. Tôi sẽ thử một cái gì đó như thế này (Lưu ý rằng tôi đã không kiểm tra nó nên cú pháp của tôi có thể hơi sai).
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()) {
}
}
}
}