Co jest warte, jeśli chcesz tylko wziąć zapytanie i zrzucić gdzieś zawartość, wygląda na to, że wykonujesz trochę więcej pracy, niż musisz. Złożoność może stanowić dodatkowe wyzwanie podczas debugowania.
Naprawdę prosty przykład odczytywania zapytania i kierowania danych wyjściowych do pliku może wyglądać tak:
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();
Chociaż może nie wyglądać na znacznie krótszą niż podany przez Ciebie kod, myślę, że jest prostszy i łatwiejszy do debugowania po wyjęciu z pudełka. Nie testowałem tego, więc nie mogę powiedzieć na pewno, że działa, chociaż myślę, że jest całkiem blisko.
Kolejna rzecz, o której warto wspomnieć… żadne z tych danych nie jest prawdziwym plikiem CSV. Musisz się upewnić, że obsługujesz osadzone przecinki, znaki zwrotne itp., jeśli znajdują się one w którymkolwiek z danych wyjściowych. Jest to jednak dość łatwe.