无为清净楼资源网 Design By www.qnjia.com
首先声明以下几点:
1、也许讲解有点初级,希望高手不要“喷”我,因为我知道并不是每一个人都是高手,我也怕高手们说我装13;
2、如有什么不对的地方,还希望大家指出,一定虚心学习;
3、本文属于作者原创,尊重他人劳动成果,转载请注明作者,谢谢。
下面开讲:
  开始在遇到此问题的时候我也在网上查了很多资料,貌似没找到什么好的解决方法,然后我就开始调试程序,我发现有的时候运行不报错,有的时候运行报错,这就很纠结了,但是后来我发现我把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(){}的好处我想大家也都知道,所以我也不做过多的解释了。
标签:
DataReader

无为清净楼资源网 Design By www.qnjia.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
无为清净楼资源网 Design By www.qnjia.com

《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线

暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。

艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。

《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。