Cuối cùng nó phụ thuộc vào việc thực hiện cụ thể của System.Data.IDataReader
bạn đang đề cập đến , nhưng giả sử bạn có nghĩa là System.Data.SqlClient.SqlDataReader
.
Trong trường hợp này, reader[i]
và reader.GetValue(i)
làm chính xác điều tương tự. Thực tế, reader[i]
gọi nội bộ reader.GetValue(i)
. (Bạn có thể thấy điều này bằng cách tháo mã bằng cách sử dụng công cụ như ILSpy.). Cả hai thành viên này trả về giá trị trong cột thứ i của hàng hiện tại và sẽ trả về thành công bất kể loại giá trị (kiểu trả về là object
). Tài liệu cho cả hai thành viên này là một chút sai lầm và có thể được diễn đạt một cách tốt hơn. Bạn có thể sử dụng một trong các thành viên này ở bất cứ nơi nào bạn thích, chỉ cần chọn một thành viên mà bạn cảm thấy tốt hơn.
Trong khi reader.GetString(i)
được thiết kế đặc biệt để trả về giá trị chứa trong cột thứ i của hàng hiện tại dưới dạng string
. Nếu giá trị trong cột đó không phải là string
, thì InvalidCastException
sẽ bị ném. Sử dụng phương pháp này khi bạn chắc chắn rằng giá trị là string
và string
là loại mà bạn muốn làm việc. Điều này sẽ làm cho mã của bạn ngắn gọn hơn vì bạn sẽ không phải thực hiện một dàn diễn viên.
Trong trường hợp cụ thể của bạn, giá trị trong cột thứ i của hàng hiện tại phải thuộc loại string
, đó là lý do tại sao giá trị trả lại của cả ba thành viên giống hệt nhau.
Nếu được viết chính xác, các triển khai khác của System.Data.IDataReader
sẽ hoạt động theo cùng một cách.
Nguồn
2011-12-08 20:42:07
Có trường hợp cạnh khủng khiếp, trong đó 'GetValue' trả về' byte', nhưng 'GetInt32' không thể truyền byte sang Int32 –
Thật khó để nói (đặc biệt vì mã tháo rời khó theo dõi) nhưng nó xuất hiện các giá trị trong cột phải đã được các loại mong muốn nếu không thì InvalidCastException (mà chính nó là một chút sai lầm) sẽ được ném. Tôi sẽ chỉnh sửa câu trả lời. –
Thật vậy, tài liệu cho GetInt32 (http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.getint32.aspx) nói rằng "Không có chuyển đổi nào được thực hiện, do đó, dữ liệu được truy xuất phải đã là số nguyên có dấu 32 bit. " Các phương thức GetXXX khác được ghi lại tương tự. –