Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如果没有更多行要读取,则关闭SqlDataReader - C#。

如果没有更多行要读取,则关闭SqlDataReader - C#。
EN

Stack Overflow用户
提问于 2017-09-05 01:04:21
回答 2查看 751关注 0票数 0

这让我头疼。我知道这个问题(或者至少是它的变体)已经问过很多次了,但是在一个标记为重复之前,请考虑以下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    string myConnectionString =  myConnectionString = ConfigurationManager.ConnectionStrings["DBCS"].ToString();
     SqlConnection mySQLConnection;
     SqlCommand mySQLCommand;
     SqlDataReader mySQLDataReader;

    using (mySQLConnection = new SqlConnection(myConnectionString))
    {
       mySQLCommand = new SqlCommand("SELECT TOP 1 * FROM Table ORDER BY Id DESC", mySQLConnection);
       mySQLCommand.Connection = mySQLConnection;
       mySQLCommand.Connection.Open();
       using(mySQLDataReader = mySQLCommand.ExecuteReader())
       {
         if (mySQLDataReader.HasRows)
         {
             if (mySQLConnection.State == ConnectionState.Open)
             {
                while (mySQLDataReader.Read())
                {
                  //Perform Logic : If the last record being returned meets some condition then call the below method
                   MethodCalled();
                }            
            }
         }
      }
         MessageBox.Show("Connection state: " + mySQLConnection.State);
   }

我想找一种方法:

  1. 读者读完后关闭。
  2. while-loop已完成读取,并且不再有行时,它将退出

但我只是不断地得到一个SqlException,说明如下:

关闭读取器时调用读的尝试无效

从广泛的观察来看,我可以跟踪错误是因为我返回了只包含一行的数据。问题是,在读取了该行之后,编译器返回到While(mySQLDataReader.Read()){},并尝试读取不包含任何行的表。

我尝试了以下几点:

  1. ExecuteReader()using块中的命令对象中包装,这样一旦读取完成如下操作,它就会自动关闭读取器和连接: 使用(mySQLDataReader= mySQLCommand.ExecuteReader()) {//逻辑执行}
  2. 就在while-loop的结束大括号之前,我试着检查是否还有更多的行从sql命令中留下/返回,并在满足该条件后退出循环: 如果(mySQLDataReader.HasRows == false) //没有更多行要读取{==;//中断循环}

两次尝试都没有成功。我怎么才能避开这一切?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-05 01:15:48

它必须是以下三件事之一:

  1. Read()块之外使用using。请记住,using块将隐式调用阅读器上的CloseDispose。因此,任何Read()调用都必须放在using块中。
  2. using块的主体是显式关闭读取器。这似乎不太可能。
  3. 显然,你已经宣布你的mySQLDataReader在一个更高的水平。可能是其他一些(异步)代码关闭了读取器。这也不太可能。在大多数情况下,您不应该在全局级别定义DataReader

编辑

阅读您现在发布的完整代码块,我建议进行一些修改。您能不能运行以下命令并告诉我们它是否运行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using (var mySQLConnection = new SqlConnection(myConnectionString))
{
   mySQLCommand = new SqlCommand("SELECT TOP 1 * FROM Table ORDER BY Id DESC", mySQLConnection, mySQLConnection);
   mySQLCommand.Connection.Open();
   using(mySQLDataReader = mySQLCommand.ExecuteReader())
   {
      while (mySQLDataReader.Read())
      {
        //Perform Logic : If the last record being returned meets some condition then call the below method
         MethodCalled();
      }            
   }
}

如果这个版本运行良好,那么我们可以更好地挖掘这个问题。

票数 3
EN

Stack Overflow用户

发布于 2017-09-05 01:54:47

如果没有要迭代的数据,则while循环将完全不执行。您需要检查HasRows本身吗?此外,在创建数据读取器时应使用CommandBehavior.CloseConnection。这将确保一旦您阅读了底层连接,就会关闭它。

如果我打电话给SqlDataReader.HasRows,应该打给SqlReader.Read吗?

SQLDataReader源代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using (SqlConnection mySQLConnection = new SqlConnection(myConnectionString))
{
using (SqlCommand mySQLCommand = new SqlCommand("SELECT TOP 1 * FROM Table ORDER BY Id DESC", mySQLConnection))
  {
    mySQLConnection.Open();

    SqlDataReader mySQLDataReader = mySQLCommand.ExecuteReader(CommandBehavior.CloseConnection);
     while (mySQLDataReader.Read())
       {
          //Code logic here
        }
        // this call to mySQLDataReader.Close(); will close the underlying connection
         mySQLDataReader.Close();
    }
     MessageBox.Show("Connection state: " + mySQLConnection.State);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46051038

复制
相关文章
thinkphp5 读取多行文本、读取文件分割多行文本
德宏大魔王
2023/08/08
2410
c# access数据库[连接数据库代码]
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说c# access数据库[连接数据库代码],希望能够帮助大家进步!!!
Java架构师必看
2022/03/22
4.5K0
c# access数据库[连接数据库代码]
数据库之ADO.NET基础知识整理
       之前我们所学只能在查询分析器里查看数据,操作数据,我们不能让普通用户去学sql,所以我们搭建一个界面(Web Winform)让用户方便的操作数据库中的数据
洋仔聊编程
2019/01/15
1.9K0
Python入门 | 如果更复杂……
之前我们了解了如何用在 Python 中使用 if 语句,来根据不同的条件执行相应的代码。(《Python入门 | 假如……》)
Crossin先生
2023/09/25
1830
Python入门 | 如果更复杂……
mysql技巧:如果记录存在则更新/如果不存在则插入的三种处理方法
新增一个员工时,如果该员工已存在(以员工号f_emp_code作为判断依据),则更新,否则插入。而且工资f_salary,更新时,不得低于原工资(即:工资只能涨,不能降)。
菩提树下的杨过
2018/12/21
9.3K0
mysql executereader_ExecuteReader的用法
最近在做winform的编程,想到一真没有使用过ExecuteReader。可能以前以后它的用户不大,或者
全栈程序员站长
2022/08/31
4870
ADO数据库C#中ExecuteReader、ExecuteNonQuery、ExecuteScalar、SqlDataReader、SqlDataAdapter
CommandType 命令类型,如果是sql语句,则为CommandType.Text,否则为 CommandType.StoredProcdure
全栈程序员站长
2022/08/28
8700
nginx设置header如果没有值
map 指令是由 ngx_http_map_module 模块提供的,默认情况下安装 nginx 都会安装该模块。
十毛
2022/08/23
1.4K0
nginx设置header如果没有值
如果没有 IDE,该如何 Debug?
写代码时噼里啪啦,一顿操作猛如虎,一运行,发现不是 error 就是 exception,这是程序员经常遇到的场景,解决它就需要一步步去排错,排错的这个过程叫做 Debug。
somenzz
2021/11/19
4060
如果没有 IDE,该如何 Debug?
C#操作Sql Server数据库以及MD5加密存储
简单地写一下MD5加密存储和C#如何操作Sql Server数据库吧。(注意哦:真的是特别简单地写了一下几个对象的实例化)。
喜欢ctrl的cxk
2019/11/07
2K0
如果VxRail要发朋友圈
VxRail S670在3月15日正式上市销售,难怪大V这么兴奋,原来是VxRail S670正式亮相了啊,话不多说,来看看这新人的本事吧。
用户5498443
2022/04/19
3200
如果VxRail要发朋友圈
重新审视SqlDataReader的使用
      ADO.NET 1.x 利用SqlDataReader读取数据,针对每个结果集需要一个独立的连接。当然,你还必须管理这些连接并且要付出相应的内存和潜在的应用程序中的高度拥挤的瓶颈代价-特别是在数据集中的Web应用程序中。       ADO.NET 2.的一个新特征多数据结果集(Multiple Active Result Sets,简称MARS)-它允许在单个连接上执行多重的数据库查询或存储过程。这样的结果是,你能够在单个连接上得到和管理多个、仅向前引用的、只读的结果集。目前实现这个功能的数据
张善友
2018/01/19
7510
C#项目实战练习:做自己的QQ
  C#程序设计实战练习项目,做一个类似于QQ的软件,程序参考明日科技出版的《C#项目开发入门实战》第一章:Q友,做自己的QQ。
小孙同学
2022/01/17
7.6K0
C#项目实战练习:做自己的QQ
如果VxRail要发朋友圈
VxRail S670在3月15日正式上市销售,难怪大V这么兴奋,原来是VxRail S670正式亮相了啊,话不多说,来看看这新人的本事吧。
大数据在线
2022/04/06
3110
如果VxRail要发朋友圈
浅谈ADO.NET中的对象——Connection、Command、DataReader、DataAdapter、DataSet、DataTable
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/details/39450171
DannyHoo
2018/09/13
1.2K0
浅谈ADO.NET中的对象——Connection、Command、DataReader、DataAdapter、DataSet、DataTable
C# Resx资源读取.
C# 新手教程. QQ截图20190321105537.png 读取时代码如下: ResourceManager ret = new ResourceManager(typeof(index)); // 当前类名index. MessageBox.Show(ret.GetString("indxe1")); 2.png 读取代码如下: Resource1.test3; 简单直接. 3.png
Tuesday
2019/03/21
1.5K0
C# Resx资源读取.
C#读取XML文件
如下XML文件:(算是一个属性值比较多的xml文件。。。读取该Xml算是我在公司实际的一个任务)
ryzenWzd
2022/05/07
1.9K0
C#读取XML文件
C# 简单读取文件
如果有找到比我上面代码更少的方法请告诉我,这里不用安装第三方的库,是在快速创建新的项目进行测试
林德熙
2018/09/19
1.2K0
C# 简单读取文件
如果有找到比我上面代码更少的方法请告诉我,这里不用安装第三方的库,是在快速创建新的项目进行测试
林德熙
2022/08/04
1.2K0
使用C#进行XML文档读取
这节讲一下如何使用C#操作xml文档。操作xml类的命名空间在System.Xml下。
zls365
2021/04/23
1.3K0
使用C#进行XML文档读取

相似问题

无法从sqldatareader读取多行

32

C# SqlDataReader写入多行

12

使用SqlDataReader同时读取多行(块读取)

13

使用sqldatareader读取多行数据

14

C# SqlDataReader被关闭

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文