while usar recuperar mediante executereader dbdatareader datos data como c# .net csv oledb

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

http://kbcsv.codeplex.com/

using (var reader = new CsvReader("data.csv")) { reader.ReadHeaderRecord(); foreach (var record in reader.DataRecords) { var name = record["Name"]; var age = record["Age"]; } }