Search code examples
c#sql-serverdelimiterfilereaderexport-to-text

Not to add delimiter after last column while exporting SQL Server data to txt file - c#


I am exporting a table's data from SQL Server to a text file.

I want to append a delimiter after every column except the last column (header + data) but the code I wrote adds a delimiter after last column also.

How can I prevent it?

public static void export_to_txt()
{
    SqlDataReader reader;

    string query = "Select * from tablename";
    string connStr = ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;
    string strDelimiter = "\t";
    string strFilePath = @"mypath";

    StringBuilder sb = new StringBuilder();

    using (SqlConnection conn = new SqlConnection(connStr))
    {
        conn.Open();

        using (reader = new SqlCommand(query, conn).ExecuteReader())
        {
            for (int i = 0; i < reader.FieldCount; i++)
            {
                sb.Append(reader.GetName(i));
                sb.Append(strDelimiter);
            }

            sb.Append(Environment.NewLine);

            if (reader.HasRows)
            {
                Object[] items = new Object[reader.FieldCount];

                while (reader.Read())
                {
                    reader.GetValues(items);

                    foreach (var item in items)
                    {
                        sb.Append(item.ToString());
                        sb.Append(strDelimiter);
                    }

                    sb.Append(Environment.NewLine);
                }
            }
        }

        conn.Close();
        File.WriteAllText(strFilePath, sb.ToString());
    }
}

Solution

  • using (reader = new SqlCommand(query, conn).ExecuteReader())
    {
         for (int i = 0; i < reader.FieldCount; i++)
         {
               sb.Append(reader.GetName(i));
               if( i < (reader.FieldCount -1)
                   sb.Append(strDelimiter);
         }
         sb.Append(Environment.NewLine);
         if (reader.HasRows)
         {
              Object[] items = new Object[reader.FieldCount];
    
              while (reader.Read())
              {
                    reader.GetValues(items);
                    sb.Append(string.Join(strDelimiter,item.ToString()));
                    sb.Append(Environment.NewLine);
              }
          }
     }