web-dev-qa-db-fra.com

Comment obtenir une valeur de colonne spécifique à partir d'un DataTable?

J'ai un datatable. J'ai besoin d'extraire une certaine valeur de colonne en fonction de l'entrée de l'utilisateur. Par exemple, disons que le datatable a deux colonnes CountryID et CountryName.

J'ai besoin de trouver le CountryID dans le datatable en fonction du nom du pays saisi par l'utilisateur. Je pourrais simplement ouvrir une connexion avec DB et lancer la requête select countryID from Country où countryName = @userinput. Y at-il de toute façon je pourrais le faire sur le datatable.

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

Bien que cela puisse ne pas compiler directement, vous devriez en avoir l’idée, mais je suis sûr qu’il serait nettement supérieur de faire la requête en SQL, car un énorme datatable mettra beaucoup de temps à parcourir toutes les lignes.

17
Jimmy

Je suggère une telle méthode basée sur les méthodes d'extension:

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

System.Data.DataSetExtensions.dll doit être référencé.

9
Deilan

Les tables de données ont une méthode .Select, qui renvoie un tableau de lignes en fonction des critères que vous spécifiez. Quelque chose comme ça:

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

Bien sûr, si userinput contient le caractère ', une exception sera créée (comme si vous interrogiez la base de données). Vous devriez échapper aux caractères (j'utilise une fonction pour le faire).

1
ACB

Je suppose que vous pourriez utiliser un objet DataView à la place, cela vous permettrait alors de tirer parti de la propriété RowFilter, comme expliqué ici:

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

Selon le titre du post, je voulais juste obtenir toutes les valeurs d'une colonne spécifique Voici le code que j'ai utilisé pour y parvenir. 

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