Si sirve de algo, si todo lo que desea es tomar una consulta y volcar el contenido en alguna parte, parece que está haciendo un poco más de trabajo del necesario. La complejidad puede aumentar el desafío de la depuración.
Un ejemplo realmente básico de leer una consulta y dirigir la salida a un archivo podría verse así:
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();
Si bien es posible que no parezca dramáticamente más corto que el código que enumeró, creo que es más simple y será más fácil de depurar, listo para usar. No he probado esto, así que no puedo decir con certeza que funcione, aunque creo que está bastante cerca.
Otra cosa que vale la pena mencionar... ninguno de estos es una verdadera salida CSV. Debe asegurarse de manejar comas incrustadas, caracteres de retorno, etc., en caso de que estén en alguna de las salidas. Sin embargo, eso es bastante fácil de hacer.