Za to, co stojí za to, pokud vše, co chcete, je vzít dotaz a někde vysypat obsah, vypadá to, že děláte trochu víc práce, než musíte. Složitost může zvýšit náročnost ladění.
Opravdu holý příklad čtení dotazu a přesměrování výstupu do souboru může vypadat takto:
SqlConnection sqlCon = new SqlConnection("REMOVED");
sqlCon.Open();
SqlCommand sqlCmd = new SqlCommand(
"Select * from products.products", sqlCon);
SqlDataReader reader = sqlCmd.ExecuteReader();
string fileName = "test.csv";
StreamWriter sw = new StreamWriter(fileName);
object[] output = new object[reader.FieldCount];
for (int i = 0; i < reader.FieldCount; i++)
output[i] = reader.GetName(i);
sw.WriteLine(string.Join(",", output));
while (reader.Read())
{
reader.GetValues(output);
sw.WriteLine(string.Join(",", output));
}
sw.Close();
reader.Close();
sqlCon.Close();
I když to nemusí vypadat dramaticky kratší než kód, který jste uvedli, myslím si, že je jednodušší a bude snazší ladit hned po vybalení. Netestoval jsem to, takže nemohu s jistotou říci, že to funguje, i když si myslím, že je to docela blízko.
Další věc, která stojí za zmínku... ani jedno z toho není skutečný výstup CSV. Musíte si být jisti, že zpracováváte vložené čárky, návratové znaky atd., pokud by byly v některém z výstupů. To je však dost snadné.