9

我在该网站和 Google 上进行了查看,但我似乎无法为我正在尝试做的事情找到一个好的解决方案。

基本上,我有一个客户端服务器应用程序 (C#),我在其中向服务器发送一条 SQL 选择语句(连接到 SQL Server 2008),并希望以 CSV 方式将结果返回给客户端。

到目前为止,我有以下内容:

if (sqlDataReader.HasRows)
{
    while(sqlDataReader.Read())
    {
       //not really sure what to put here and if the while should be there!
    }

} `

不幸的是,我对将 C# 与 SQL 连接起来真的很陌生。我需要有关如何简单地将结果以 csv 格式放入字符串的任何提示。列和字段可能会有所不同,因此我无法使用某些 [something] 的方法,就像我在几个站点中看到的那样。我不确定我是否可以理解!

我真的很感激任何关于如何解决这个问题的提示/要点!

4

5 回答 5

16

这是我用来将任何 IDataReader 转储到 StreamWriter 的方法。我通常像这样创建 StreamSwriter new StreamWriter(Response.OutputStream):. 我将输入中的任何双引号字符转换为单引号字符(可能不是处理此问题的最佳方法,但它对我有用)。

public static void createCsvFile(IDataReader reader, StreamWriter writer) {
    string Delimiter = "\"";
    string Separator = ",";

    // write header row
    for (int columnCounter = 0; columnCounter < reader.FieldCount; columnCounter++) {
        if (columnCounter > 0) {
            writer.Write(Separator);
        }
        writer.Write(Delimiter + reader.GetName(columnCounter) + Delimiter);
    }
    writer.WriteLine(string.Empty);

    // data loop
    while (reader.Read()) {
        // column loop
        for (int columnCounter = 0; columnCounter < reader.FieldCount; columnCounter++) {
            if (columnCounter > 0) {
                writer.Write(Separator);
            }
            writer.Write(Delimiter + reader.GetValue(columnCounter).ToString().Replace('"', '\'') + Delimiter);
        }   // end of column loop
        writer.WriteLine(string.Empty);
    }   // data loop

    writer.Flush();
}
于 2009-12-26T16:43:08.857 回答
2

如前所述,分隔符、正确转义字符以及正确格式化不同类型存在很多问题。但是,如果您只是在寻找将数据放入字符串的示例,这里还有一个示例。它不会对上述并发症进行任何检查。

  public static void ReaderToString( IDataReader Reader )
     {
     while ( Reader.Read() )
        {
        StringBuilder str = new StringBuilder();
        for ( int i = 0; i < Reader.FieldCount; i++ )
           {

           if ( Reader.IsDBNull( i ) )
              str.Append( "null" );
           else
              str.Append( Reader.GetValue( i ).ToString() );

           if ( i < Reader.FieldCount - 1 )
              str.Append( ", " );

           }
        // do something with the string here
        Console.WriteLine(str);
        }
     }
于 2009-12-26T16:54:14.450 回答
2

在处理 CSV 文件时,我通常使用 FileHelpers库:它有一个SqlServerStorage类,您可以使用它从 SQL 服务器读取记录并将它们写入 CSV 文件。

于 2009-12-26T21:13:33.570 回答
1

您可以调整此处提供的 CSV 编写器的实现。

如果还需要解析CSV文件,这里的实现还是比较好的。

CSV 格式比它看起来更复杂 - 特别是如果您要处理从查询返回的任意数据。您需要能够处理特殊字符(如引号和逗号)的转义,处理换行符等。您最好找到并使用经过验证的实现 - 特别是如果您是 C# 新手。

于 2009-12-26T16:32:51.530 回答
1

您可以像这样获取表列名称:

SqlConnection conn = new SqlConnection(connString);
conn.Open();

SqlCommand cmd = new SqlCommand(sql, conn);
SqlDataReader rdr = cmd.ExecuteReader();

DataTable schema = rdr.GetSchemaTable();
foreach (DataRow row in schema.Rows) 
{
    foreach (DataColumn col in schema.Columns)
        Console.WriteLine(col.ColumnName + " = " + row[col]);
}

rdr.Close()
conn.Close();

当然,您可以仅使用第一行来确定列名,这里它对每一行都进行。

您现在可以将自己的代码轻松地加入到 CSV 行中...

谢谢

于 2009-12-26T16:42:25.833 回答