2016-09-23 3 views
0

У меня есть сильфона код:Лучший способ удалить самый последний возврат каретки в StreamWriter.WriteLine C#

SqlDataReader Rdr = Cmd.ExecuteReader(); 
if (Rdr.HasRows) 
{ 
    using (StreamWriter writer = new StreamWriter("c:\\Test.txt")) 
    { 
     while (Rdr.Read()) 
     { 
      writer.WriteLine(Rdr["Item1"].ToString() + Rdr["Item2"].ToString()); 
     } 
    }       
} 
Rdr.Close(); 

WriteLine добавляет возврат каретки каждый раз, но мне нужно, чтобы избежать этого, при достижении последней строки.

Я нашел сильфона код, чтобы знать, когда SqlDataReader находится в последней строке, где в этот момент я могу изменить WriteLine по Write который не добавляет возврат каретки:

if (reader.HasRows) 
{ 
    var loop = true; 
    while (loop) 
    { 
     //1. Here retrive values you need e.g. var myvar = reader.GetBoolean(0); 
     loop = reader.Read(); 
     if (!loop) 
     { 
      //You are on the last record. Use values read in 1. 
      //Do some exceptions 
     } 
     else { 
      //You are not on the last record. 
      //Process values read in 1., e.g. myvar 
     } 
    } 
} 

Любая другая идея сделать это лучше?

ответ

2

Это может быть достигнуто с простым флагом и отдельным Write/WriteLine:

bool first = true; 
while (Rdr.Read()) 
{ 
    if (!first) writer.WriteLine(); 
    writer.Write(Rdr["Item1"].ToString() + Rdr["Item2"].ToString()); 
    first = false; 
} 
0

Я предполагаю, что вы говорите о комментарии //1. Here retrive values you need e.g. var myvar = reader.GetBoolean(0); и что вы не хотите создавать промежуточные переменные для всех отдельных столбцов.

Это очень возможно, потому что в этом не так много пользы. Вы можете просто использовать свойство HasRows, чтобы узнать, есть ли что-то, чтобы прочитать после вы только что прочитали предыдущую строку, и если да, напишите новую строку.

while (reader.Read()) 
{ 
    // Build the line you want to write 
    string lineToWrite = reader["Item1"].ToString() + reader["Item2"].ToString(); 

    // Write the line without carriage return 
    writer.Write(lineToWrite); 

    if (reader.HasRows) 
    { 
     writer.WriteLine(); 
    } 
} 
0

Вы можете написать возврат каретки непосредственно перед записью новой строки для всех линий, кроме первой строки. Ваш код должен выглядеть следующим образом:

if(reader.Read()) 
{ 
    // write first line without carriage return in the beginning 
} 
while(reader.Read()) 
{ 
    //write a carriage return 
    // ... and then write your line 
} 
+0

OP не требует возврата каретки только для последней строки. – CodeCaster

0

Вот что мне нравится делать в ситуациях, как это:

SqlDataReader Rdr = Cmd.ExecuteReader(); 
if (Rdr.HasRows) 
{ 
    using (StreamWriter writer = new StreamWriter("c:\\Test.txt")) 
    { 
     string eol = ""; 
     while (Rdr.Read()) 
     { 
      writer.Write("{0}{1}{2}", eol, Rdr["Item1"], Rdr["Item2"]); 
      eol = Environment.NewLine; 
     } 
    }       
} 
Rdr.Close(); 
Смежные вопросы