Vale a pena, se tudo o que você quer é fazer uma consulta e despejar o conteúdo em algum lugar, parece que você está fazendo um pouco mais de trabalho do que o necessário. A complexidade pode aumentar o desafio na depuração.
Um exemplo realmente simples de ler uma consulta e direcionar a saída para um arquivo pode ser assim:
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();
Embora possa não parecer drasticamente mais curto do que o código que você listou, acho que é mais simples e será mais fácil de depurar, pronto para uso. Eu não testei isso, então não posso dizer com certeza que funciona, embora eu ache que está bem próximo.
Outra coisa que vale a pena mencionar... nenhuma dessas é uma saída CSV verdadeira. Você precisa ter certeza de lidar com vírgulas incorporadas, caracteres de retorno, etc., caso eles estejam em alguma saída. Isso é bastante fácil de fazer, no entanto.