web-dev-qa-db-fra.com

DataRow: sélectionne la valeur d'une cellule d'après un nom de colonne

J'ai un problème avec un DataRow avec lequel je me bats vraiment.

La base de données est lue dans une feuille de calcul Excel à l'aide d'une connexion OleDbConnection.

Si j'essaie de sélectionner des données à partir du DataRow à l'aide du nom de colonne, il renvoie DBNull même s'il contient des données.

Mais ce n'est pas si simple.

datarow.Table.Columns[5].ColumnName renvoie "ma colonne".
datarow["my column"] renvoie DBNull.
datarow[5] renvoie 500.
datarow[datarow.Table.Columns[5].ColumnName] renvoie DBNull. (juste pour s'assurer que ce n'est pas une faute de frappe!)

Je pourrais simplement sélectionner des éléments dans la base de données en utilisant le numéro de colonne, mais je n'aime pas le faire, car si le classement des colonnes change, le logiciel va casser.

34
VaticanUK

Quelle version de .NET utilisez-vous? Depuis .NET 3.5, il existe un Assembly System.Data.DataSetExtensions, qui contient diverses extensions utiles pour dataTables, dataRows et autres.

Vous pouvez essayer d'utiliser 

row.Field<type>("fieldName");

si cela ne fonctionne pas, vous pouvez le faire:

DataTable table = new DataTable();
var myColumn = table.Columns.Cast<DataColumn>().SingleOrDefault(col => col.ColumnName == "myColumnName");
if (myColumn != null)
{
    // just some roww
    var tableRow = table.AsEnumerable().First();
    var myData = tableRow.Field<string>(myColumn);
    // or if above does not work
    myData = tableRow.Field<string>(table.Columns.IndexOf(myColumn));
}
51
Hassan

Ce doit être une nouvelle fonctionnalité ou quelque chose, sinon je ne suis pas sûr de savoir pourquoi cela n’a pas été mentionné.

Vous pouvez accéder à la valeur d'une colonne dans un objet DataRow à l'aide de row["ColumnName"]:

DataRow row = table.Rows[0];
string rowValue = row["ColumnName"].ToString();
45
Jimmy

Je trouve plus facile d'y accéder en procédant comme suit:

        for (int i = 0; i < Table.Rows.Count-1; i++) //Looping through rows
        {
            var myValue = Table.Rows[i]["MyFieldName"]; //Getting my field value

        }
8
Gabriel G

Allusion

DataTable table = new DataTable();
table.Columns.Add("Column#1", typeof(int));
table.Columns.Add("Column#2", typeof(string));
table.Rows.Add(5, "Cell1-1");
table.Rows.Add(130, "Cell2-2");

EDIT: Ajouté plus

string cellValue = table.Rows[0].GetCellValueByName<string>("Column#2");

public static class DataRowExtensions
{
    public static T GetCellValueByName<T>(this DataRow row, string columnName)
    {
        int index = row.Table.Columns.IndexOf(columnName);
        return (index < 0 || index > row.ItemArray.Count()) 
                  ? default(T) 
                  : (T) row[index];        
    }
}
6
sll

En plus de ce que Jimmy a dit, vous pouvez également créer le générique select en utilisant Convert.ChangeType avec les vérifications nulles nécessaires:

public T GetColumnValue<T>(DataRow row, string columnName)
  {
        T value = default(T);
        if (row.Table.Columns.Contains(columnName) && row[columnName] != null && !String.IsNullOrWhiteSpace(row[columnName].ToString()))
        {
            value = (T)Convert.ChangeType(row[columnName].ToString(), typeof(T));
        }

        return value;
  }
2
Abraham Roy

Vous pouvez obtenir la valeur de la colonne dans VB.net

Dim row As DataRow = fooTable.Rows(0)
Dim temp = Convert.ToString(row("ColumnName"))

Et en C #, vous pouvez utiliser Answer de Jimmy , soyez prudent lorsque vous le convertissez en ToString(). Il peut générer une exception null si les données sont null À la place. Utilisez Convert.ToString(your_expression) pour éviter une exception null reference

1
Kamran
for (int i=0;i < Table.Rows.Count;i++)
{
      Var YourValue = Table.Rows[i]["ColumnName"];
}
0
Himadripatel1986