【问题标题】:C# SQLServer retrieving results and place in a .csv formatC# SQLServer 检索结果并以 .csv 格式放置
【发布时间】:2010-12-30 03:22:55
【问题描述】:

我在该网站和 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] 的方法,就像我在几个站点中看到的那样。我不确定我是否可以理解!

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

【问题讨论】:

  • 如果 PowerShell 是您的选择,它同时具有 SQL Server 模块和内置的 CSV 编写器。一些 POSH 天才可能会告诉你如何用一个语句来做到这一点。

标签: c# sql sql-server client-server resultset


【解决方案1】:

这是我用来将任何 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();
}

【讨论】:

  • 谢谢!我将其调整为我的解决方案,它就像一个魅力!非常感谢
  • 这个答案是错误的!它不会将内容编码为 CSV,甚至不会处理底层数据集中的逗号...
  • 我通过将所有数据项括在引号中来处理逗号。我不知道为什么我需要对数据进行编码——也许有些应用程序需要,但我的不需要。
【解决方案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);
        }
     }

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      您或许可以调整 CSV 写入器 available here 的实现。

      如果还需要解析CSV文件,implementation here比较好。

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

      【讨论】:

      • 链接已损坏。如果有的话,请推荐新的。
      【解决方案5】:

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

      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 行中...

      谢谢

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-23
        • 1970-01-01
        • 2018-09-24
        • 2017-05-17
        相关资源
        最近更新 更多