尽管存在数据,但SqlDataReader不会读取数据

时间:2016-08-26 04:26:44

标签: c# .net sql-server sqldatareader

SqlDataReader rdItems;

SqlCommand itemsCmd = new SqlCommand();
itemsCmd.CommandText = query;
itemsCmd.CommandTimeout = 0;
itemsCmd.Connection = sqlCon;

 sqlCon.Open();

 rdItems = itemsCmd.ExecuteReader();

 if (rdItems.HasRows)
 {   
     while (rdItems.Read())
     {
         itemType = rdItems["I1"].ToString();

以上是我用于从SqlDataReader读取数据的代码。问题是rdItems中存在数据但是当执行rdItems.Read()行时,阅读器中的行会消失。请让我知道我哪里出错了。

1 个答案:

答案 0 :(得分:0)

AFAIK,SqlDataReader只能在ExecuteReader之后消费一次,意味着while循环遍历阅读器,只需在所有行完成阅读时退出。因此,当选中HasRows后循环移动到下一行时,读取器上的所有先前行都不再可用,除非它们被放入DataTable或列表中。

通过使用DataTable,您可以检查DataReader内容是否存在,并在存在任何行时迭代它们:

// assume your query like "SELECT DISTINCT I1 FROM NewItems"
// resulting single column with multiple distinct value rows

rdItems = itemsCmd.ExecuteReader();

DataTable dt = new DataTable();
dt.Load(rdItems); // load DataReader contents to a DataTable, resulting an empty DataTable if no row exists

// check if datatable is not empty as substitute of SqlDataReader.HasRows property
if (dt.Rows.Count > 0)
{
    foreach (DataRow row in dt.Rows)
    {
        // get row data
        itemType = row.Field<String>(0);
    }
}

欢迎任何建议或改进。

参考:DataReader has rows and data, trying to read from it says "no data is present"