tôi vẻ để nhớ lại rằng nó có thể đôi khi bằng cách nhanh hơn để có được giá trị như một đối tượng và sau đó kiểm tra nếu đó là DBNull.
private Int32? GetNullableInt32(SqlDataReader dataReader, int fieldIndex)
{
object value = dataReader.GetValue(fieldIndex);
return value is DBNull ? (Int32?) null : (Int32) value;
}
Đó là ít nhất đáng để thử. Lưu ý rằng đây là giả định bạn có thể unbox thẳng đến một int
... Tôi không biết chắc đó có phải là chính xác hay không, nhưng nó sẽ dễ thấy.
Bây giờ có một cách tiếp cận mà là hơi ít an toàn - nó sẽ trả về null cho bất kỳ giá trị không nguyên, thậm chí nếu lĩnh vực này thực sự là một chuỗi, ví dụ:
private Int32? GetNullableInt32(SqlDataReader dataReader, int fieldIndex)
{
return dataReader.GetValue(fieldIndex) as Int32?;
}
trước đây tôi đã viết về "như" với các loại nullable không được nhanh như tôi mong đợi, nhưng điều này có thể là một trường hợp hơi khác ... một lần nữa, nó có giá trị có một đi.
Tuy nhiên, tôi thực sự ngạc nhiên nếu điều này thực sự là một nút cổ chai ... chắc chắn nhận được dữ liệu từ cơ sở dữ liệu ở nơi đầu tiên sẽ đắt hơn rất nhiều. Bạn có điểm chuẩn cho điều này?
Nguồn
2010-07-15 08:57:54
Tôi nghĩ rằng đó là về tốt như bạn sẽ nhận được. – LukeH
Tôi nhớ đọc kiểm tra IsDBNull chậm. Điều này chạy 5 triệu lần trong khoảng 2 giây. Tôi cũng có các phương pháp tương tự cho tất cả các loại khác. Thậm chí tăng 10% trên phương pháp này sẽ giảm thời gian ồ ạt. –
@Robin Day Tôi sẽ lần đầu tiên hồ sơ để tìm kiếm các cuộc tấn công hiệu suất đầu tiên - đạt được tỷ lệ phần trăm so với nỗ lực, tôi sẽ tranh luận về điều này, sẽ là một trong những mức thấp nhất mà bạn thấy. –