web-dev-qa-db-de.com

Wie erhalte ich einen bestimmten Spaltenwert aus einer DataTable?

Ich habe eine Datentabelle. Ich muss einen bestimmten Spaltenwert basierend auf der Benutzereingabe abrufen. Nehmen wir zum Beispiel an, dass die Datentabelle zwei Spalten CountryID und CountryName hat.

Ich muss CountryID in der Datentabelle finden, basierend auf dem Ländernamen, der vom Benutzer eingegeben wurde. Ich könnte einfach eine Verbindung mit der DB öffnen und die Abfrage select countryID von Country mit countryName = @userinput ausführen. Gibt es sowieso könnte ich das auf der Datentabelle machen.

33
peace
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();
62
Seattle Leonard
foreach (DataRow row in Datatable.Rows) 
{
    if (row["CountryName"].ToString() == userInput) 
    {
        return row["CountryID"];
    }
}

Obwohl dies möglicherweise nicht direkt kompiliert wird, sollten Sie die Idee erhalten. Ich bin sicher, dass es eine überlegene Aufgabe wäre, die Abfrage über SQL auszuführen, da eine große Datentabelle alle Zeilen lange durchläuft.

17
Jimmy

Ich empfehle einen solchen Weg basierend auf Erweiterungsmethoden:

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

System.Data.DataSetExtensions.dll muss referenziert werden.

9
Deilan

Datatables haben eine .Select-Methode, die ein Zeilenarray gemäß den von Ihnen angegebenen Kriterien zurückgibt. Etwas wie das:

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

Wenn userinput 'Zeichen enthält, wird natürlich eine Ausnahme ausgelöst (z. B. wenn Sie die Datenbank abfragen). Sie sollten die 'Zeichen entziehen (ich verwende dazu eine Funktion).

1
ACB

Ich nehme an, Sie könnten stattdessen ein DataView-Objekt verwenden. Auf diese Weise können Sie die RowFilter-Eigenschaft wie hier beschrieben nutzen:

http://msdn.Microsoft.com/de-de/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");
}
1
Dal

Laut Titel des Beitrags musste ich nur alle Werte aus einer bestimmten Spalte abrufen. Hier ist der Code, den ich dazu verwendet habe. 

    public static IEnumerable<T> ColumnValues<T>(this DataColumn self)
    {
        return self.Table.Select().Select(dr => (T)Convert.ChangeType(dr[self], typeof(T)));
    }
0
cdiggins