Como especificar o delimitador ao importar arquivos CSV via OLEDB em C #
Eu preciso executar uma importação complexa em um Microsoft SQL Server 2000.
Como fazer isso em um DTS é muito complicado, estou tentando fazer isso com um pequeno programa C #, mas estou tendo problemas quando preciso importar arquivos CSV: esse arquivo está usando ponto e vírgula como delimitadores de campo em vez de vírgulas e Não consigo que o provedor OLE DB do .NET o reconheça.
Eu já encontrei várias "soluções" na net como usarExtended Properties="Text; Format=Delimited"
ou `` Propriedades Estendidas = "Texto; Formato = Delimitado (;)"in the connection string or using a
arquivo schema.ini` sem sucesso.
Este é o código real que estou 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);
}
}
}
Alguma idéia de como obter o ponto e vírgula como separador de campo sem depender de bibliotecas externas?
Notas:
O bit "sem depender de bibliotecas externas" é porque eu preciso importar o arquivo diretamente no banco de dados e nenhuma biblioteca que encontrei pode fazer isso (eles retornam strings), e nosso PHB não gastará nem um centavo por uma solução comercial.Sei que posso importar o arquivo por meio de um DTS, mas preciso executar ramificações complexas no fluxo de trabalho e alterações de arquivos antes e depois da importação, o que resultaria em saltar dentro e fora do DTS.Fazer tudo dentro do DTS não seria práticopara mim, como eu não sou tão habilidoso em codificação ActiveX e VBScript.Agradecemos antecipadamente, Andrea.
Editar 1 - @andyb: Código do programa de teste paraschema.ini
aproximação:
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);
}
}
}