2012-07-28 32 views

Trả lời

15

Sử dụng mô hình này để xác định và xử lý hàng cuối cùng trong kết quả:

if (reader.Read()) 
{ 
    var loop = true; 
    while (loop) 
    { 
     //1. Here retrive values you need e.g. var myvar = reader.GetBoolean(0); 
     loop = reader.Read(); 
     if (!loop) 
     { 
      //You are on the last record. Use values read in 1. 
      //Do some exceptions 
     } 
     else { 
      //You are not on the last record. 
      //Process values read in 1., e.g. myvar 
     } 
    } 
} 
+0

Cảm ơn bạn, đây là giải pháp tốt nhất! – wben

+3

Chỉ cần thay thế nếu (reader.Read()) nếu (reader.HasRow) – wben

+2

@wben Trong trường hợp này, bạn sẽ không thể đọc các giá trị ở đầu của lần lặp đầu tiên. –

4

Khác với "không có một số nào khác sau đó", không. Điều này có nghĩa là bạn cần phải đệm hàng, cố gắng đọc, sau đó xem xét dữ liệu đệm nếu nó bật ra là cuối cùng.

Trong nhiều trường hợp, khi dữ liệu vừa phải và bạn đang xây dựng mô hình đối tượng, bạn chỉ cần xem dữ liệu đã tạo, tức là tạo List<T> của tất cả các hàng khi sử dụng trình đọc, sau đó , xem hàng cuối cùng trong danh sách.

+0

Vâng, nhưng tôi không muốn vượt qua hai vòng !! – wben

+0

@wben nếu nó nằm trong danh sách, vòng lặp là cực kỳ rẻ - hoặc chỉ truy cập bằng chỉ mục: 'list [list.Count-1]'. Tất nhiên, đệm hàng trước đó thậm chí còn rẻ hơn, nhưng phức tạp hơn. –

+0

@wben để làm cho mọi thứ rõ ràng hơn, trong câu trả lời được chấp nhận, ở đây là nói "// 1. Ở đây retrive giá trị bạn cần ví dụ var myvar = reader.GetBoolean (0);", đó là những gì tôi/chúng tôi có nghĩa là "đệm hàng, cố gắng đọc, sau đó xem xét dữ liệu đệm nếu nó bật ra là cuối cùng ". Ví dụ mã làm cho nó rõ ràng hơn, tất nhiên. –

1

Để lặp qua SqlDataReader:

SqlDataReader reader = ...; 
while(reader.Read()) 
{ 
    // the reader will contain the current row 
} 

Không có gì khi kể người đọc là bạn là hàng cuối cùng. Nếu bạn vẫn cần phải nhận được trên hàng cuối cùng, có lẽ lưu trữ dữ liệu của hàng trong một biến riêng biệt, bạn có thể nhận được dữ liệu đó sau khi thoát khỏi vòng lặp.

lựa chọn thay thế khác sẽ là:

  • để có được các dữ liệu vào một DataSet/DataTable
  • để lưu trữ dữ liệu trong một danh sách/mảng
  • lấy dữ liệu theo thứ tự ngược (viết lại truy vấn của bạn) , để hàng đầu tiên là hàng bạn muốn.
+0

trình đọc không phải là một điều tra viên mà nó không có MoveNext(). Trước tiên, bạn cần yêu cầu điều tra viên, tức là reader.GetEnumerator() –

+0

@RamanZhylich: Bạn nói đúng. Nó phải là reader.Read(). Đã sửa! (sửa bài viết) –

0

Một khả năng khác là đặt thông tin vào tập dữ liệu.

Bạn đang đọc dữ liệu bằng truy vấn. Hãy gọi nó là q. Sử dụng truy vấn này để thay thế:

select row_number() over (order by (select NULL)) as seqnum, 
     count(*) over (partition by null) as numrecs 
     q.*, 
from (<q>) q 
order by seqnum 

Bây giờ kỷ lục cuối cùng có SEQNUM = numrecs, mà bạn có thể kiểm tra trong ứng dụng của bạn.

Nhân tiện, điều này giả định rằng bạn đang truy xuất dữ liệu theo cách không theo thứ tự. Nếu bạn muốn đặt hàng, hãy đặt tiêu chí trong mệnh đề "order by" cho row_number().

0

Bạn không thể làm điều đó mà không lặp lại chính mình ví dụ: lấy kỷ lục hai lần.Dưới đây là một phương pháp ngắn

System.Data.DataTable dt = new System.Data.DataTable(); 
dt.Load(myDataReader); 
int recordCount = dt.Rows.Count; 
if(recordCount > 0) 
{ 
    if(dt.Rows[recordCount-1]["username"] == "wrong value") 
    throw new Exception("wrong value"); 
} 

tôi đã viết này off-hand vì vậy nó không được thử nghiệm nhưng đó là cách tiếp cận

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