2010-05-26 74 views
29

Tôi có một datatable. Tôi cần tìm nạp một giá trị cột nhất định dựa trên đầu vào của người dùng. Ví dụ, cho phép nói datatable có hai cột CountryID và CountryName.Cách lấy Giá trị cột cụ thể từ một DataTable?

Tôi cần tìm CountryID trong dữ liệu có thể đặt dựa trên tên quốc gia của người dùng nhập. Tôi chỉ có thể mở một kết nối với DB và chạy truy vấn chọn countryID từ Quốc gia nơi countryName = @userinput. Có anyway tôi có thể làm điều này trên datatable.

Trả lời

59
string countryName = "USA"; 
DataTable dt = new DataTable(); 
int id = (from DataRow dr in dt.Rows 
       where (string)dr["CountryName"] == countryName 
       select (int)dr["id"]).FirstOrDefault(); 
+0

Tất nhiên 'DataTable' sẽ được điền từ DB của bạn –

+0

Vòng tránh né .. rất trơn! cảm ơn bạn! –

0

Tôi cho rằng bạn có thể sử dụng một đối tượng DataView thay vào đó, điều này thì sẽ cho phép bạn tận dụng lợi thế của tài sản RowFilter như đã giải thích ở đây:

http://msdn.microsoft.com/en-us/library/system.data.dataview.rowfilter.aspx

private void MakeDataView() 
{ 
    DataView view = new DataView(); 

    view.Table = DataSet1.Tables["Countries"]; 
    view.RowFilter = "CountryName = 'France'"; 
    view.RowStateFilter = DataViewRowState.ModifiedCurrent; 

    // Simple-bind to a TextBox control 
    Text1.DataBindings.Add("Text", view, "CountryID"); 
} 
+0

Cảm ơn, tôi chưa thử. Tôi có thể di chuyển giá trị sang một biến thay vì liên kết với một trường văn bản không? – peace

+1

Không được thử nghiệm, nhưng bạn có thể thử: string CountryName = view.Table.Rows [0] ["CountryName"]. ToString(); – Dal

16
foreach (DataRow row in Datatable.Rows) 
{ 
    if (row["CountryName"].ToString() == userInput) 
    { 
     return row["CountryID"]; 
    } 
} 

Trong khi điều này có thể không biên dịch trực tiếp bạn nên có được ý tưởng, tôi cũng chắc chắn nó sẽ là tuyệt vời hơn nhiều để làm các truy vấn thông qua SQL như là một datatable lớn sẽ mất một thời gian dài để chạy qua tất cả các hàng.

+0

Đơn giản và thẳng thắn, nhưng như bạn đã nói, điều này có thể rất nhiều trong tương lai sau. – peace

+0

Tất cả trong tất cả sẽ không hiệu quả hơn chỉ sử dụng SQL, LINQ to Datatables và Datatables/Dataviews sẽ phải tải tất cả các bản ghi vào bộ nhớ và sau đó truy vấn chúng – Jimmy

+0

Một tùy chọn khác chỉ đơn giản là sử dụng LINQ to sql – Jimmy

1

Phương thức có phương thức .Select, trả về mảng hàng theo tiêu chí bạn chỉ định. Một cái gì đó như thế này:

Dim oRows() As DataRow 

oRows = dtCountries.Select("CountryName = '" & userinput & "'") 

If oRows.Count = 0 Then 
    ' No rows found 
Else 
    ' At least one row found. Could be more than one 
End If 

Tất nhiên, nếu userinput chứa 'ký tự, nó sẽ tăng ngoại lệ (như nếu bạn truy vấn cơ sở dữ liệu). Bạn nên thoát khỏi 'ký tự (tôi sử dụng một hàm để làm điều đó).

8

Tôi đề nghị theo cách như vậy dựa trên phương pháp khuyến nông:

IEnumerable<Int32> countryIDs = 
    dataTable 
    .AsEnumerable() 
    .Where(row => row.Field<String>("CountryName") == countryName) 
    .Select(row => row.Field<Int32>("CountryID")); 

System.Data.DataSetExtensions.dll cần phải được tham chiếu.

+1

Đây chính xác là những gì tôi đang tìm kiếm, cảm ơn bạn! Tôi gần như đã bỏ lỡ nhận xét cuối cùng của bạn về tài liệu tham khảo - cảm ơn bạn vì điều đó. – kwill

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