2016-09-23 1 views
0

Ich habe unten Code zu entfernen:bester Weg, um den allerletzten Wagenrücklauf in 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 fügt einen Wagenrücklauf jedes Mal, aber ich brauche, um zu vermeiden, dass, wenn die letzte Zeile erreicht ist.

ich unten Code zu wissen, gefunden, wenn die SqlDataReader in der letzten Zeile ist, wo dieser Punkt I der WriteLine von Write ändern kann, die nicht den Wagenrücklauf hinzufügt:

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 
     } 
    } 
} 

Jede andere Idee zu tun das besser?

Antwort

2

Es kann mit einfacher Flagge und separaten Write/WriteLine erreicht werden:

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

Ich nehme an, Sie sprechen über den Kommentar //1. Here retrive values you need e.g. var myvar = reader.GetBoolean(0);, und dass Sie keine Zwischenvariablen für alle separaten Spalten erstellen möchten.

Das ist sehr machbar, weil es nicht viel nützt, das überhaupt zu machen. Sie können einfach die HasRows Eigenschaft verwenden, um zu sehen, ob es etwas zu lesen gibt nach Sie gerade die vorherige Zeile lesen, und wenn ja, schreiben Sie eine Zeilenumbrüche.

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

Sie können einen Wagenrücklauf schreiben, bevor Sie eine neue Zeile für alle Zeilen außer der ersten Zeile schreiben. Der Code soll wie folgt aussehen:

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

Das OP möchte _not_ nur für die letzte Zeile einen Wagenrücklauf haben. – CodeCaster

0

Hier ist, was ich in Situationen wie diesen tun:

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(); 
Verwandte Themen