c# - datos - DataRow: Seleccione el valor de celda por un nombre de columna dado
datatable rows c# (6)
Tengo un problema con un DataRow con el que realmente estoy luchando.
El datarow se lee desde una hoja de cálculo Excel usando un OleDbConnection.
Si trato de seleccionar datos del DataRow usando el nombre de columna, devuelve DBNull aunque haya datos allí.
Pero no es así de simple.
datarow.Table.Columns[5].ColumnName
devuelve "mi columna".
datarow["my column"]
devuelve DBNull.
datarow[5]
devuelve 500.
datarow[datarow.Table.Columns[5].ColumnName]
devuelve DBNull. (¡solo para asegurarse de que no sea un error tipográfico!)
Podría simplemente seleccionar cosas del datarow usando el número de columna, pero no me gusta hacer eso ya que si el orden de las columnas cambia, el software se romperá.
¿Qué versión de .NET estás usando? Desde .NET 3.5, hay un ensamblado System.Data.DataSetExtensions, que contiene varias extensiones útiles para dataTables, dataRows y similares.
Puedes intentar usar
row.Field<type>("fieldName");
si eso no funciona, puedes hacer esto:
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));
}
Además de lo que dijo Jimmy, también puedes hacer el genérico de selección usando Convert.ChangeType
junto con las verificaciones necesarias nulas:
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;
}
Esta debe ser una característica nueva o algo así; de lo contrario, no estoy seguro de por qué no se ha mencionado.
Puede acceder al valor en una columna en un objeto DataRow
usando row["ColumnName"]
:
DataRow row = table.Rows[0];
string rowValue = row["ColumnName"].ToString();
Insinuación
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");
EDITAR: Agregó más
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];
}
}
Me resulta más fácil acceder haciendo lo siguiente:
for (int i = 0; i < Table.Rows.Count-1; i++) //Looping through rows
{
var myValue = Table.Rows[i]["MyFieldName"]; //Getting my field value
}
for (int i=0;i < Table.Rows.Count;i++)
{
Var YourValue = Table.Rows[i]["ColumnName"];
}