Đối với những gì nó đáng giá, nếu tất cả những gì bạn muốn là thực hiện một truy vấn và đổ nội dung vào một nơi nào đó, có vẻ như bạn đang làm nhiều việc hơn những gì bạn phải làm. Sự phức tạp có thể tăng thêm thách thức trong việc gỡ lỗi.
Một ví dụ thực sự rõ ràng về việc đọc một truy vấn và chuyển hướng đầu ra tới một tệp có thể trông giống như sau:
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();
Mặc dù nó có thể không ngắn hơn đáng kể so với mã bạn đã liệt kê, nhưng tôi nghĩ nó đơn giản hơn và sẽ dễ gỡ lỗi hơn. Tôi chưa thử nghiệm điều này, vì vậy tôi không thể chắc chắn rằng nó hoạt động, mặc dù tôi nghĩ rằng nó khá gần.
Một điều đáng nói khác ... cả hai đều không phải là đầu ra CSV thực sự. Bạn cần đảm bảo rằng bạn xử lý các dấu phẩy nhúng, ký tự trả về, v.v., nếu chúng có trong bất kỳ đầu ra nào. Tuy nhiên, điều đó đủ dễ dàng để thực hiện.