C# SqlDataReader从不返回False

C# SqlDataReader从不返回False,c#,sql,sqldatareader,C#,Sql,Sqldatareader,我正在使用SqlDataReader编写包含多个工作表的Excel工作簿。每个工作表都有页眉、正文和页脚,所以我在while循环中使用while循环 问题是reader.Read()从未为我返回false,因此eof从未设置为false。在文件的末尾,当我试图写入头时,我得到一个错误,因为读卡器是空的 具体的错误消息是: 当不存在数据时尝试读取无效 请查看我的代码,如果可以,请提供帮助 reader = cmd.ExecuteReader(); bool eof = false; bool fi

我正在使用
SqlDataReader
编写包含多个工作表的Excel工作簿。每个工作表都有页眉、正文和页脚,所以我在while循环中使用while循环

问题是
reader.Read()
从未为我返回false,因此eof从未设置为false。在文件的末尾,当我试图写入头时,我得到一个错误,因为读卡器是空的

具体的错误消息是:

当不存在数据时尝试读取无效

请查看我的代码,如果可以,请提供帮助

reader = cmd.ExecuteReader();
bool eof = false;
bool first = true;

while (!eof)
{
    // write a header 
    // set newHeaderCondition from the Reader -- error occurs here
    if (first)
    {
        reader.Read();
        first = false;
    }

    do
    {
        // write row onto spreadsheet
        eof = reader.Read();   ---- THIS IS NEVER FALSE
    } while (!eof && (reader[0] == newHeaderCondition ));

    // write footer that doesn't contain any reader data
    if (!eof )
    {
        // create a new worksheet
    }
}

reader.Close();

我不完全理解你描述的行为,但我怀疑你误解了你的观察结果

一个明显的错误是给
eof
分配了错误的值。当仍有数据时,将
true
分配给
eof
,当没有数据时,将
false
分配给eof

你可能是说:

eof = !reader.Read();
使读取器前进到下一条记录,并返回
true
,只要有更多行;否则
false


问题在于循环条件,它只执行一次(即使有更多行),修改while条件并修改它

没错。我需要做的是将while条件更改为while(eof!=false…)你是对的-我得到了eof值的true和false颠倒