2010-05-26 19 views
29

मेरे पास एक डाटाटेबल है। मुझे उपयोगकर्ता इनपुट के आधार पर एक निश्चित कॉलम मान लाने की आवश्यकता है। उदाहरण के लिए, मान लें कि डेटाटेबल में दो कॉलम CountryID और CountryName हैं।डेटाटेबल से एक विशिष्ट कॉलम वैल्यू कैसे प्राप्त करें?

मुझे उपयोगकर्ता इनपुट देश के नाम के आधार पर डेटिडेट में देश आईडी खोजने की आवश्यकता है। मैं सिर्फ डीबी के साथ एक कनेक्शन खोल सकता हूं और क्वेरी देश से देश देश का चयन कर सकता हूं जहां देश नाम = @userinput। वैसे भी मैं डेटाटेबल पर ऐसा कर सकता हूं। हालांकि यह संकलन नहीं हो सकता है

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"); 
} 

उत्तर

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

बेशक 'डेटाटेबल' आपके डीबी –

+0

से पॉप्युलेट हो जाएगा लूप से बचें .. बहुत चालाक! धन्यवाद! –

0

मैं तुम्हें एक DataView वस्तु के बजाय इस्तेमाल कर सकते हैं लगता है, यह तो आप RowFilter संपत्ति का लाभ लेने के यहां बताए की अनुमति होगी सीधे आपको यह विचार मिलना चाहिए, मुझे भी यकीन है कि एसक्यूएल के माध्यम से क्वेरी करने के लिए यह बहुत बेहतर होगा क्योंकि एक विशाल डेटाटेबल को सभी पंक्तियों के माध्यम से चलाने में काफी समय लगेगा।

+0

धन्यवाद, मैंने अभी तक यह कोशिश नहीं की है। क्या मैं टेक्स्ट फ़ील्ड को बाध्य करने के बजाय वैल्यू को वैरिएबल में ले जा सकता हूं? – peace

+1

परीक्षण नहीं किया गया, लेकिन आप कोशिश कर सकते हैं: स्ट्रिंग CountryName = view.Table.Rows [0] ["CountryName"]। ToString(); – Dal

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

:

+0

सरल और सीधे बिंदु पर, लेकिन जैसा कि आपने कहा था, यह बाद के भविष्य में बहुत अधिक खर्च कर सकता है। – peace

+0

सभी कुछ भी एसक्यूएल, LINQ से डेटाटेबल्स और डेटाटेबल्स/डाटाव्यूज़ का उपयोग करने से अधिक कुशल होने वाला नहीं है, सभी को सभी रिकॉर्ड्स को मेमोरी में लोड करना होगा और फिर उन्हें – Jimmy

+0

से पूछना होगा। दूसरा विकल्प बस एसक्यूएल – Jimmy

1

डेटाटेबल्स में एक है। चयन विधि, जो आपके द्वारा निर्दिष्ट मानदंडों के अनुसार पंक्तियों सरणी देता है। कुछ इस तरह:

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 

बेशक, अगर userinput 'वर्ण है, यह एक अपवाद उठाएंगे (जैसे आप डेटाबेस क्वेरी है)। आपको 'अक्षर से बचना चाहिए (मैं ऐसा करने के लिए एक फ़ंक्शन का उपयोग करता हूं)।

8

मैं विस्तार तरीकों के आधार पर इस तरह का सुझाव:

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

System.Data.DataSetExtensions.dll संदर्भित किया जाना चाहिए।

+1

यह वही है जो मैं ढूंढ रहा था, धन्यवाद! मैं संदर्भ के बारे में आपकी अंतिम टिप्पणी लगभग चूक गया - इसके लिए भी धन्यवाद। – kwill

संबंधित मुद्दे