2011-12-08 50 views
9

DataReader [i] vs DataReader.GetValue (i) vs DataReader.GetString (i)

dataReader[i] 

logic tương đương với

dataReader.GetValue(i) 

Họ có giống nhau không? Chúng có khác nhau không? Có một tình huống mà người ta sẽ thích hợp hơn người kia không?

documented differently:

  • Gets cột nằm ở chỉ số quy định
  • Return giá trị của lĩnh vực quy định.

Nhưng khi tôi sử dụng chúng đều trả về giá trị của trường. "Lấy cột" có ý nghĩa gì? "Trả lại giá trị của một trường" có nghĩa là gì?


Bonus nhí:

Khi tôi gọi:

reader[i]; 
reader.GetValue(i); 
reader.GetString(i); 

tôi nhận được một String mỗi lần

Trả lời

15

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]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à stringstring 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.

+0

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 –

+0

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. –

+0

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ự. –

Các vấn đề liên quan