【问题标题】:SqlDataReader does not read data inspite of data being thereSqlDataReader 不读取数据,尽管存在数据
【发布时间】:2016-08-26 16:16:35
【问题描述】:
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() 行被执行时,来自阅读器的行消失了。请让我知道我哪里出错了。

【问题讨论】:

  • 你有什么异常吗?
  • 也不例外。只是执行没有进入while循环。
  • 你的query是什么样的?? 行消失是什么意思?
  • @marc_s - 我的查询是这样的。查询=“从新项目中选择不同的I1”;我得到15行。但是当执行 .Read() 语句时,Enumeration Yielded 没有结果。阅读器变空了。
  • I1from 之间是三个空格吗?

标签: c# .net sql-server sqldatareader


【解决方案1】:

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"

【讨论】:

    猜你喜欢
    • 2021-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-16
    相关资源
    最近更新 更多