zoukankan      html  css  js  c++  java
  • 已有打开的与此命令相关联的DataReader,必须首先将它关闭。对于此异常的个人的理解!

      今天与大家分享一下“已有打开的与此命令相关联的DataReader,必须首先将它关闭。”这个异常的个人理解,首先声明以下几点:

    1、也许讲解有点初级,希望高手不要“喷”我,因为我知道并不是每一个人都是高手,我也怕高手们说我装13;

    2、如有什么不对的地方,还希望大家指出,一定虚心学习;

    下面开讲:

      开始在遇到此问题的时候我也在网上查了很多资料,貌似没找到什么好的解决方法,然后我就开始调试程序,我发现有的时候运行不报错,有的时候运行报错,这就很纠结了,但是后来我发现我把ASP.NET Development Server - 端口 xxx退出,然后再运行程序就不报错了...我以为是好了,可以后来我有发现一个问题,只要端口没关或者程序运行时候把页面不停的刷新,就会报错“已有打开的与此命令相关联的DataReader,必须首先将它关闭。”

      我火了,我开始把程序下N个断点,一步调试,我也没发现我是用了DataReader对象啊,这就奇怪了,为什么我没用DataReader对象,它却包这样的错误?我很是无语也。经过我反复的推敲,终于找到了解决的办法,原来这个异常不一定跟DataReader有关哦,也有可能跟Connection对象有关哦!

      看下面代码:  

    private static SqlConnection Sqlconnection;
    public static SqlConnection SqlConnection
    {
    get
    {
    string SqlconnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["TandyTang"].ToString();
    if (Sqlconnection == null)
    {
    Sqlconnection = new SqlConnection(SqlconnectionString);
    Sqlconnection.Open();
    }
    else if (Sqlconnection.State == System.Data.ConnectionState.Closed)
    {
    Sqlconnection.Open();
    }
    else if (Sqlconnection.State == System.Data.ConnectionState.Broken)
    {
    Sqlconnection.Close();
    Sqlconnection.Open();
    }
    return Sqlconnection;
    }
    }
    ///<summary>
    /// SqlGetDataTable
    ///<param name="proc"></param>
    ///<param name="type"></param>
    ///<param name="param"></param>
    ///<param name="count"></param>
    ///<returns>DataTable</returns>
    public static DataTable SqlGetDataTable(string proc, CommandType type, string[] param, out int count)
    {
    DataSet ds = new DataSet();
    using (SqlCommand cmd = new SqlCommand(proc, SqlConnection))
    {
    SqlParameter[] myParms = new SqlParameter[2];

    myParms[0] = new SqlParameter("@Id", SqlDbType.Int, 4);
    myParms[0].Value = paramValue[0];
    myParms[1] = new SqlParameter("@Name", SqlDbType.VarChar, 50);
    myParms[1].Value = paramValue[1];
    foreach (SqlParameter parameter in myParms)
    {
    cmd.Parameters.Add(parameter);
    }
    cmd.CommandType = type;
    SqlDataAdapter da = new SqlDataAdapter(cmd);
    da.Fill(ds);
    }
    return ds.Tables[0];
    }

      以上代码,我相信在一般人看来,应该都没问题,我也认为没什么问题。第一段代码是创建数据连接,并打开数据库连接,第二段代码是创建一个SqlCommand,其中要用到SqlConnection作为第一个参数,这就是问题的关键。

      如果在页面上值运行一遍SqlGetDataTable()方法就不会出任何问题,如果不停的页面的刷新页面就“已有打开的与此命令相关联的DataReader,必须首先将它关闭。”这样的异常(也许不会出现哦,你试试就知道了。代码红色字体部分就是出现错误提示的地方

      经过我的思考,终于找到了解决的办法,解决办法如下,看下面代码:  

         private static string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["TandyTang"].ConnectionString;       
        ///<summary>
    /// SqlGetDataTable
    ///<param name="proc"></param>
    ///<param name="type"></param>
    ///<param name="param"></param>
    ///<param name="count"></param>
    ///<returns>DataTable</returns>
    public static DataTable SqlGetDataTable(string proc, CommandType type, string[] param, out int count)
    {
    DataSet ds = new DataSet();
    using (SqlConnection con = new SqlConnection(connectionString))
    {
    using (SqlCommand cmd = new SqlCommand(proc, con))
    {
    SqlParameter[] myParms = new SqlParameter[11];

    myParms[0] = new SqlParameter("@Id", SqlDbType.Int, 4);
    myParms[0].Value = paramValue[0];
    myParms[1] = new SqlParameter("@Name", SqlDbType.VarChar, 50);
    myParms[1].Value = paramValue[1];
    foreach (SqlParameter parameter in myParms)
    {
    cmd.Parameters.Add(parameter);
    }
    cmd.CommandType = type;
    using (SqlDataAdapter da = new SqlDataAdapter(cmd))
    {
    da.Fill(ds);
    }
    }
    return ds.Tables[0];
    }
    }

      应该发现有什么不同的地方了吧,上面的方法,没用用到SqlConnection方法,而是把SqlConnection对象写到using(){}里面的。

      PS:个人建议大家不要用第一种方法,也许会遇到很的麻烦的哦,个人建议多用using(){}语句把ADO.NET的没对象都放到using(){}里面最好了,using(){}的好处我想大家也都知道,所以我也不做过多的解释了。祝大家写代码写得愉快...

    作者:大神神风
    出处:http://www.cnblogs.com/tandyshen/
    感谢您点【推荐】 ,祝您事业有成,生活愉快,健康美丽。
  • 相关阅读:
    qemu的几篇文章---涉及qemu的注入
    网络以及linux相关--重点参考--包含相关linux服务的部署和使用
    ipv6的相关情况简略说明
    向日葵服务器相关ip,通过ipset过滤(oray.com oray.net),可能不完整,需要dnsmasq ipset持续监听相关域名
    linux shell重要参考网站
    web信息收集分类
    针对管理员的信息收集 以及 它的意义
    目标网站弱点功能探测
    网站文件目录探测
    目标后台探测以及物理路径探测
  • 原文地址:https://www.cnblogs.com/tandyshen/p/adonet.html
Copyright © 2011-2022 走看看