ExecuteReader 要求已打开且可用的连接。

hsqtl 2011-08-09 09:22:09
f5刷新出现
抛出错误:******************2011-8-9 9:16:3*******************
ExecuteReader 要求已打开且可用的连接。连接的当前状态为正在连接。####select top 8 * from jingq where ntype=1 order by nid desc
*******************2011-8-9 9:16:3*******************
*******************2011-8-9 9:16:4*******************
内部连接致命错误。####select top 10 * from jingq where ntype=2 and jqlx=2 order by nid desc

调用:
this.mjxs.DataSource = SqlDAL.jingq.getNews(8, "jingq", "where ntype=1 ", "nId");
this.mjxs.DataBind();

相关函数
public static DataTable getNews(int top, string table, string where, string id)
{
return DbExec.GetDataTable("select top " + top + " * from " + table + " " + where + " order by " + id + " desc");
}

调用datatable
public static DataTable GetDataTable(string str)
{
DataTable dt = new DataTable();

try
{
Connection();
using ( sqlAda = new SqlDataAdapter(str, sqlCon))
//sqlAda.SelectCommand.CommandTimeout = 60;
{
DataSet ds = new DataSet();
sqlAda.Fill(ds);
ds.CaseSensitive = false;
//dt = ds.Tables[0];
if (ds != null && ds.Tables.Count > 0)
{
dt = ds.Tables[0];

}
}

}
catch (Exception ex)
{
Log.log(ex.Message + "####" + str);
sqlCon.Close();
sqlCon.Dispose();
}
finally
{
sqlCon.Close();
sqlCon.Dispose();
}
return dt;


}

链接
public static void Connection()
{
try
{
sqlCon = new SqlConnection(connectionString);
if (sqlCon.State == System.Data.ConnectionState.Closed)
{
sqlCon.Open();
}
else
{
sqlCon.Close();
sqlCon.Dispose();
}
}
catch (Exception ex)
{
Log.log(ex.Message );
sqlCon.Close();
sqlCon.Dispose();
}

}
请高手给看看什么问题?
...全文
257 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
hsqtl 2011-08-09
  • 打赏
  • 举报
回复
感谢各位了。
namhyuk 2011-08-09
  • 打赏
  • 举报
回复
其实
if (sqlCon.State == System.Data.ConnectionState.Closed)
{
sqlCon.Open();
}
这样的动作是比较耗时间的。

另外,看代码,我倒是没看出来哪里用到了SqlDataReader,不过还是再强调一下,SqlDataAdapter参与的时候,它会自动帮你打开和关闭连接,无需用sqlCon.Open()或Close().

这个你可以用小程序测试
SqlDataAdapter sqlAda = new SqlDataAdapter(str, sqlCon);
然后该干吗干吗,不需要Open,也不需要Close,程序照样OK。
hsqtl 2011-08-09
  • 打赏
  • 举报
回复
else //注销了
{
sqlCon.Close();
sqlCon.Dispose();
}
你应该在sqlAda.Fill(ds);之后再加一个关闭连接的代码

错误减少了很多

namhyuk 2011-08-09
  • 打赏
  • 举报
回复
还有个问题就是SqlDataAdapter这家伙会在必要时自动为你打开/关闭连接。也就是说凡是有SqlDataAdapter的地方原则上是不应该有显式地调用Connection.Open()这样的必要的。
ohkuy 2011-08-09
  • 打赏
  • 举报
回复
if (sqlCon.State == System.Data.ConnectionState.Closed)
{
sqlCon.Open();
}
else //注销一下
{
sqlCon.Close();
sqlCon.Dispose();
}
}
你将else后面的那段注销再看看
我姓区不姓区 2011-08-09
  • 打赏
  • 举报
回复
你的Connection()方法逻辑有问题
没连接就连接,连接上了就断开
这就造成第一次进页面的时候打开了连接,然后取出数据以后没把连接关掉,F5刷新页面以后由于连接已打开,然后把连接给关闭了,这时候再取数据当然会出问题
你应该在sqlAda.Fill(ds);之后再加一个关闭连接的代码
namhyuk 2011-08-09
  • 打赏
  • 举报
回复
连接的当前状态为正在连接?就像是有人还没拉完屎,外面就有人在狂敲门?
a344586704 2011-08-09
  • 打赏
  • 举报
回复
之前没有碰到这样的情况,坐等高人,围观,
abrahamkang 2011-08-09
  • 打赏
  • 举报
回复
public static void Connection()
{
try
{
sqlCon = new SqlConnection(connectionString);
if (sqlCon.State == System.Data.ConnectionState.Closed)
{
sqlCon.Open();
}
else
{
sqlCon.Close();
sqlCon.Dispose();
}
}
catch (Exception ex)
{
Log.log(ex.Message );
sqlCon.Close();
sqlCon.Dispose();
}

}
请高手给看看什么问题?


根据这个,万一你之前也调用了connection(),原来是调用过,就已经open了,现在再调用,就变close..
这样就连不上了。。去试下断点看看是不是我说的情况
hsqtl 2011-08-09
  • 打赏
  • 举报
回复
程序运行没有问题 摁住f5刷新就出现问题了
快溜 2011-08-09
  • 打赏
  • 举报
回复
连接不上去?数据库服务启动了吗?。。

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧