c# - read - diferencia entre obtener valor de DataRow
read datarow vb net (2)
Depende de su propósito, pero si observa una definición de ambos, eso puede indicarle;
Fila de propiedad de DataRow.Item (DataColumn) row["name"]
DataRowExtensions.Field Method (DataRow, DataColumn) row.Field<string>("name")
Código de muestra:
DataTable table = new DataTable();
// ...
// insert column to table
table.Columns.Add("name");
// ...
// insert value to table
foreach (DataRow row in table.Rows) {
row["name"];
row.Field<string>("name");
}
Mi pregunta es:
- ¿Hay alguna diferencia entre usar la
row["name"]
y larow.Field<string>("name")
? Por supuesto, la segunda forma de emitir valor a algún tipo, pero ¿hay otra diferencia? - ¿Qué método es mejor usar?
Vea la sección de Comentarios , las principales diferencias que se describen allí:
La clase DataSet representa valores nulos con la instancia de valor de la clase DBNull . Una expresión de consulta integrada en el idioma (LINQ) que accedió a una columna con un valor nulo generaría una excepción InvalidCastException en tiempo de ejecución. Además, DataSet no admite tipos anulables . El método Field proporciona soporte para acceder a columnas como tipos anulables . Si el valor subyacente en el DataSet es el valor, el tipo de nullable devuelto tendrá un valor nulo .
Si el valor de la columna de datos especificada es nulo y T es un tipo de referencia o un tipo anulable, el tipo de retorno será nulo . El método de campo no devolverá el valor.
El método Field no realiza conversiones de tipo. Si se requiere la conversión de tipo, primero debe obtener el valor de la columna utilizando el método de campo. El valor de la columna se debe convertir a otro tipo.
El último párrafo señala un punto, ya que a menudo he visto números almacenados como cadenas en la base de datos, por lo que se requiere la conversión de varchar
a int
en la recuperación de datos, por lo que en este caso es mejor usar DataColumn, por ejemplo:
int test = row.Field<int>("Test"); // InvalidCastException
int test = Convert.ToInt32(row["Test"]); // Works like a charm
DataRowExtensions.Field<T> Method (DataRow, String)
apareció por primera vez en .NET 3.5 y "proporciona un acceso muy tipado a cada uno de los valores de columna en la fila especificada. El método Field también admite tipos anulables ".
Afaik, row["name"]
devuelve object
, row.Field<string>("name")
devuelve una String
. No deberíamos comparar manzanas y peras, por lo tanto, deberías preguntar qué es mejor:
row["name"].ToString()
vs row.Field<string>("name")
y la respuesta es: son iguales.