Per quel che vale, se tutto ciò che vuoi è prendere una query e scaricare il contenuto da qualche parte, sembra che tu stia facendo un po' più di lavoro del necessario. La complessità può aumentare la sfida nel debug.
Un semplice esempio di lettura di una query e di indirizzamento dell'output a un file potrebbe essere simile a questo:
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();
Anche se potrebbe non sembrare drammaticamente più breve del codice che hai elencato, penso che sia più semplice e sarà più facile eseguire il debug, fuori dagli schemi. Non l'ho testato, quindi non posso dire con certezza che funzioni, anche se penso che sia abbastanza vicino.
Un'altra cosa degna di nota... nessuno di questi è un vero output CSV. Devi essere sicuro di gestire le virgole incorporate, i caratteri di ritorno, ecc. Se si trovano in uno qualsiasi degli output. Tuttavia, è abbastanza facile da fare.