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

J'ai un datatable. J'ai besoin de récupérer 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 CountryID dans le datatable basé sur le nom de pays d'entrée de l'utilisateur. Je pourrais simplement ouvrir une connexion avec DB et exécuter la requête select countryID from Country where countryName = @ userinput. Y at-il de toute façon je pourrais le faire sur le datatable.

33
demandé sur John Saunders 2010-05-27 00:35:31

5 réponses

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();
61
répondu Seattle Leonard 2016-01-19 11:33:59
foreach (DataRow row in Datatable.Rows) 
{
    if (row["CountryName"].ToString() == userInput) 
    {
        return row["CountryID"];
    }
}

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

17
répondu Jimmy 2014-08-13 10:40:25

Je suggère une telle façon basée sur des méthodes d'extension:

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

Système.Données.DataSetExtensions.dll doit être référencé.

9
répondu Deilan 2016-02-04 17:37:21

Je suppose que vous pourriez utiliser un objet DataView à la place, cela vous permettrait alors de profiter 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
répondu Dal 2010-05-26 20:43:03

Datatables ont un .Sélectionnez la méthode, qui renvoie un tableau de lignes selon les critères que vous spécifiez. Quelque chose comme ceci:

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 ' character, il déclenchera une exception (comme si vous interrogez la base de données). Vous devriez échapper aux ' caractères (j'utilise une fonction pour le faire).

1
répondu ACB 2010-05-26 21:05:34