导出SQL Server数据为CSV文件

本文关键字:CSV 文件 数据 SQL Server 导出 | 更新日期: 2023-09-27 18:10:39

我试图从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"];
    }
}

导出SQL Server数据为CSV文件

无论如何,如果您只想执行一个查询并将内容转储到某个地方,那么看起来您所做的工作比您必须做的要多一些。复杂性可能会增加调试的挑战。

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

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输出。您需要确保处理嵌入的逗号、返回字符等,如果它们出现在任何输出中。不过,这很容易做到。