将SQL Server数据导出为CSV文件

时间:2014-06-27 18:21:06

标签: c# sql sql-server csv

我正在尝试将数据从sql server导出到csv文件中。我在网上和其他支持论坛寻求帮助,但我找不到如何做到这一点?我已经编写了自己的代码,但它不起作用 - 它只是继续加载......并且失败了。

请帮忙。这是我写的代码。

  SqlConnection sqlCon = new SqlConnection("REMOVED");
  string fileName = "test.csv";
  SqlCommand sqlCmd = new SqlCommand();
  sqlCmd.CommandText = "Select * from products.products";
  sqlCmd.Connection = sqlCon;
  sqlCon.Open();

    using (var CommandText = new SqlCommand("select * from products.products"))
    using (var reader = sqlCmd.ExecuteReader())
    using (var outFile = File.CreateText(fileName))
    {
        string[] columnNames = GetColumnNames(reader).ToArray();
        int numFields = columnNames.Length;
        outFile.WriteLine(string.Join(",", columnNames));
        if (reader.HasRows)
        {
            while (reader.Read())
            {
                string[] columnValues = 
                    Enumerable.Range(0, numFields)
                              .Select(i => reader.GetValue(i).ToString())
                              .Select(field => string.Concat("\"", field.Replace("\"", "\"\""), "\""))
                              .ToArray();
                outFile.WriteLine(string.Join(",", columnValues));
            }
        }
    }
}
private IEnumerable<string> GetColumnNames(IDataReader reader)
{
    foreach (DataRow row in reader.GetSchemaTable().Rows)
    {
        yield return (string)row["ColumnName"];
    }
}

1 个答案:

答案 0 :(得分:12)

对于它的价值,如果你想要的只是进行查询并将内容转储到某个地方,看起来你做的工作比你需要的多得多。复杂性可能会增加调试的挑战。

读取查询并将输出定向到文件的一个非常简单的示例可能如下所示:

        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();

虽然它看起来可能不会比您列出的代码短得多,但我认为它更简单,并且更容易调试,开箱即用。我没有测试过这个,所以我不能肯定地说它有效,虽然我认为它非常接近。

值得一提的另一件事......这些都不是真正的CSV输出。如果它们位于任何输出中,您需要确保处理嵌入式逗号,返回字符等。但这很容易做到。