我有以下代码:
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
}
}
}
还有其他想法以更好的方式做到这一点吗?
答案 0 :(得分:3)
可以使用简单的标记和单独的Write
/ WriteLine
:
bool first = true;
while (Rdr.Read())
{
if (!first) writer.WriteLine();
writer.Write(Rdr["Item1"].ToString() + Rdr["Item2"].ToString());
first = false;
}
答案 1 :(得分: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();
}
}
答案 2 :(得分: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
}
答案 3 :(得分: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();