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.
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));
}
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();
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
}
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];
}
}
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;
}
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
for (int i=0;i < Table.Rows.Count;i++)
{
Var YourValue = Table.Rows[i]["ColumnName"];
}