Invalid attempt to read when no data is present in dr

主宰稳场 提交于 2019-12-06 01:36:39

You have to call DataReader.Read to fetch the result:

SqlDataReader dr = cmd.ExecuteReader();
dr.Read();
// ...

DataReader.Read returns a boolean, so if you have more than 1 result, you can do:

While (dr.Read())
{
  // read data for each record here
}

Moreover, you're trying to access the dr data when there's none in this part of the code:

k.id = Convert.ToInt32(dr[0]);//Something wrong here?
k.name = dr[1].ToString();
k.password = dr[2].ToString();
k.description = dr[3].ToString();
k.created = Convert.ToDateTime(dr[4]);
k.modified = Convert.ToDateTime(dr[5])

You've got a problem with...

while (dr.HasRows)
{
   /* If this loop is entered, it will run 
    * indefinitely until the datareader miraculously 
    * loses all its rows in a hole somewhere */
}

This will either never enter, or will create an infinite loop... it's either got no rows or it has rows. What I think you meant was:

while (dr.Read())
{
   /* Do something with the current record */
}

dr.Read() loops to the next record and returns true or false depending on if there's a record to be read or not. When the data reader is initialized, the first record is not selected. It has to be selected by calling dr.Read() which will then return true if a first row is found, and indeed will return true until Read() is called when currently on the last row - i.e. there's no more rows left to read.

dr.HasRows is just a property that tells you if the datareader contains rows... which if it does will keep having rows from here until eternity. For instance, you would use this if you wanted to do something in the event it has rows and something else in the event it doesn't:

if (dr.HasRows)
{
    while (dr.Read())
    {
        /* Display data for current row */
    }
}
else
{
    Console.WriteLine("I didn't find any relevant data.");
}

You are trying to access a row in the datareader though there are no rows. i.e if the dr doesn't enter the while loop then there are no rows in the datareader, however you are still accessing the fields where you have a comment "//Something wrong here? ".

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!