usar - sql data reader c#
Al leer un archivo CSV utilizando un DataReader y el proveedor de datos OLEDB Jet, ¿cómo puedo controlar los tipos de datos de columna? (3)
Hay un archivo de esquema que puede crear que le indicaría a ADO.NET cómo interpretar el CSV, dándole de hecho una estructura.
Pruebe esto: http://www.aspdotnetcodes.com/Importing_CSV_Database_Schema.ini.aspx
En mi aplicación C # estoy usando el proveedor de datos OLEDB de Microsoft Jet para leer un archivo CSV. La cadena de conexión se ve así:
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:/Data;Extended Properties="text;HDR=Yes;FMT=Delimited
Abrí un OleObConnection de ADO.NET usando esa cadena de conexión y seleccioné todas las filas del archivo CSV con el comando:
select * from Data.csv
Cuando abro OleDbDataReader y examino los tipos de datos de las columnas que devuelve, encuentro que algo en la pila ha intentado adivinar los tipos de datos basados en la primera fila de datos en el archivo. Por ejemplo, supongamos que el archivo CSV contiene:
House,Street,Town
123,Fake Street,Springfield
12a,Evergreen Terrace,Springfield
Llamar al método OleDbDataReader.GetDataTypeName para la columna House revelará que a la columna se le ha asignado el tipo de datos "DBTYPE_I4", por lo que todos los valores leídos se interpretan como enteros. Mi problema es que House debería ser una cadena: cuando trato de leer el valor de House desde la segunda fila, OleDbDataReader devuelve null.
¿Cómo puedo decirle al proveedor de la base de datos Jet o al OleDbDataReader que interprete una columna como cadenas en lugar de números?
Para ampliar la respuesta de Marc, necesito crear un archivo de texto llamado Schema.ini y ponerlo en el mismo directorio que el archivo CSV. Además de los tipos de columna, este archivo puede especificar el formato de archivo, el formato de fecha y hora, la configuración regional y los nombres de columna si no están incluidos en el archivo.
Para hacer que funcione el ejemplo que di en la pregunta, el archivo de esquema debería verse así:
[Data.csv]
ColNameHeader=True
Col1=House Text
Col2=Street Text
Col3=Town Text
También podría intentar esto para que el proveedor de datos examine todas las filas del archivo antes de intentar adivinar los tipos de datos:
[Data.csv]
ColNameHeader=true
MaxScanRows=0
En la vida real, mi aplicación importa datos de archivos con nombres dinámicos, así que tengo que crear un archivo Schema.ini sobre la marcha y escribirlo en el mismo directorio que el archivo CSV antes de abrir mi conexión.
Se pueden encontrar más detalles aquí: http://msdn.microsoft.com/en-us/library/ms709353(VS.85).aspx o buscando en la biblioteca MSDN el "archivo Schema.ini".
por favor, compruebe
using (var reader = new CsvReader("data.csv"))
{
reader.ReadHeaderRecord();
foreach (var record in reader.DataRecords)
{
var name = record["Name"];
var age = record["Age"];
}
}