necesito para realizar una importación compleja en un Microsoft SQL Server 2000.Cómo especificar el delimitador al importar archivos CSV a través de OLEDB en C#
Desde hacerlo de una DTS es demasiado complicado, yo estoy tratando de hacer con un pequeño programa C#, pero estoy teniendo problemas cuando necesito importar un archivo CSV: este archivo usa punto y coma como delimitadores de campo en lugar de comas y no puedo obtener que el proveedor OLE DB de .NET lo reconozca.
Ya encontré varias "soluciones" en la red como usar Extended Properties="Text; Format=Delimited"
o `` Propiedades extendidas = "Texto; Formato = Delimitado (;)" in the connection string or using a
schema.ini` archivo en vano.
Este es el código real que estoy usando:
DataTable Table = new DataTable();
using (OleDbConnection Connection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source={0}; Extended Properties=\"Text;HDR=Yes;Format=Delimited\""))
{
Connection.Open();
using (OleDbCommand Command = Connection.CreateCommand())
{
Command.CommandText = "select [Field 1], [Field 2] from [file.csv]";
using (OleDbDataAdapter Adapter = new OleDbDataAdapter(Command))
{
Adapter.Fill(Table);
}
}
}
using (SqlConnection Connection = new SqlConnection("Data Source=server; Initial Catalog=database; User Id=user; Password=password;"))
{
Connection.Open();
using (SqlCommand Command = Connection.CreateCommand())
{
Command.CommandText = "insert into [table] ([field_1], [field_2], ...) values (@field_1, @field_2, ...)";
Command.Parameters.Add("field_1", SqlDbType.Date, 0, "Field 1");
Command.Parameters.Add("field_2", SqlDbType.VarChar, 100, "Field 2");
...
using (SqlDataAdapter Adapter = new SqlDataAdapter())
{
Adapter.InsertCommand = Command;
Adapter.Update(Table);
}
}
}
Cualquier ideas sobre cómo lograr usando el punto y coma como separador de campo sin depender de libriaries externos?
Notas:
- El "sin depender de libriaries externos" bit es porque necesito para importar el archivo directamente en la base de datos y ninguna biblioteca encontré puede hacer esto (que devuelven cadenas), y nuestro PHB no bajará ni un centavo por una solución comercial.
- Sé que puedo importar el archivo a través de un DTS, pero necesito realizar una bifurcación compleja en el flujo de trabajo y las modificaciones de archivos antes y después de la importación, y eso daría como resultado saltar dentro y fuera del DTS.
- Hacer todo lo que esté dentro del DTS no sería práctico para mí, ya que no soy tan hábil en la codificación de ActiveX y VBScript.
Gracias de antemano, Andrea.
Edición 1 - @andyb: código de programa de prueba para schema.ini
enfoque:
String ConnectionString = String.Format("Provider=Microsoft.Jet.OLEDB.4.0; Data Source={0}; Extended Properties=\"Text\"", Environment.CurrentDirectory);
DataTable Table = new DataTable();
using (OleDbConnection Connection = new OleDbConnection(ConnectionString))
{
Connection.Open();
using (OleDbCommand Command = Connection.CreateCommand())
{
Command.CommandText = "select * from [file.csv]";
using (OleDbDataAdapter Adapter = new OleDbDataAdapter(Command))
{
Adapter.Fill(Table);
}
}
}
Su código utiliza la sintaxis del proveedor de SQL para la cadena OleDbConnection y la sintaxis del proveedor OLE DB dentro de la cadena SqlConnection. ¿Este podría ser el problema? –
@Panagiotis Kanavos: Error de cortar y pegar, corregido. – Albireo