ExecuteReader 要求已打开且可用的连接。连接的当前状态为正在连接。

zhuxueliao 2010-09-23 04:49:37
打开网站总报ExecuteReader 要求已打开且可用的连接。连接的当前状态为正在连接。 怎么解决???急
...全文
910 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
thsurvivor 2012-06-08
  • 打赏
  • 举报
回复
问题原因是:
public static SqlConnection cnn; ----cnn对象是类变量


public void Open()
{
if (cnn == null)
{
cnn = new SqlConnection(ConfigurationManager.ConnectionStrings["tyhy_shoppingConnectionString"].ConnectionString);

}
if (cnn.State == ConnectionState.Closed)
{
try
{
cnn.Open();
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}

}
}


/// <summary>
/// 关闭数据库连接
/// </summary>
public void close()
{
if (cnn != null)
{
if (cnn.State == ConnectionState.Open)
{
cnn.Close();
}
}

}


问题所在是:web网站应用程序的使用者比较多,而且用户相对而言不固定,那么你cnn申明成类变量,容易出现,多个线程(多个用户客户端请求)都使用一个句柄。

解决方式:将cnn对象声明在要使用的地方,把SqlConnection 对象传入open里面做打开操作就可以,与之气了LZ写的代码区别不是很大,改动也很小。


/// <summary>
/// 打开数据库连接 (用户数据库)
/// </summary>
public void Open(SqlConnection cn)
{
cn = new SqlConnection(this.connectionString);
if (cn == null)
{
cn = cn.Open();
}
else if (cn.State == System.Data.ConnectionState.Closed)
{
cn.Open();
}
else if (cn.State == System.Data.ConnectionState.Broken)
{
cn.Close();
cn.Open();
}

}
zhanzhao1989 2010-09-23
  • 打赏
  • 举报
回复
支持楼上全部人
zhuxueliao 2010-09-23
  • 打赏
  • 举报
回复
什么事using语句隐性释放
jltx818ww 2010-09-23
  • 打赏
  • 举报
回复
使用数据库时得养成一个好的习惯,用完了马上关掉链接,释放内存!
楼主的报错,肯定是因为在某个连接数据库的地方打开了连接而没有关闭,所以在其他的页面再访问数据库就会导致报错!
解决方法有很多,方便的是用using语句隐性释放,可避免忘记关连接的错误!
用try语句也可以,麻烦些而已
最笨的方法就是用完就close,dispose
wuyq11 2010-09-23
  • 打赏
  • 举报
回复
不能关闭
SqlDataReader reader = m_DBComm.ExecuteReader();
if(reader.Read())
{
if (reader["CMaster_Pwd"].ToString().Equals(userPwd))
{
}
else
{
}
}
if (conn.State != ConnectionState.Open)
conn.Open();

数据库连接用后要及时释放,以供其他的连接使用
camperer 2010-09-23
  • 打赏
  • 举报
回复
ExecuteReader会一直占用连接,会报这样的错很有可能是你的用法有问题。
应该养成资源用完就dispose()掉的习惯
camperer 2010-09-23
  • 打赏
  • 举报
回复
判断一下状态呗。
它的意思是ConnectionState是Connecting,你把它先关闭,再打开。或者重新创建一个SqlConnection对象。。。
SqlConnection并不是只有open和closed两种状态
http://msdn.microsoft.com/zh-cn/library/system.data.connectionstate(v=VS.80).aspx
begintransaction 2010-09-23
  • 打赏
  • 举报
回复
何必把这些代码全贴出来。。
把返回SqlDataRader这个方法贴出来就行了
你在DBHelper类中是用了异常处理,但你把SqlDataRader return 出来时在别的层或方法里有没有加异常处理呢?

//逐行读取SqlDataReader对象中每一行数据

//并把数据添加到对象dataTable中
try
{
while (reader.Read())
{

reader.GetValues(objValues);

objDataTable.LoadDataRow(objValues, true);

}
}finally{

///关闭数据读取器

reader.Close();
}
objDataTable.EndLoadData();

return objDataTable;//返回一个DataTable对象

}

}
代码参考有问题
jcrensheng 2010-09-23
  • 打赏
  • 举报
回复
using (SqlConnection cn = new SqlConnection(连接字符串))
{
if(cn.state!=ConnectionState.Open)
cn.open();
SqlDataReader dr=...
.......

}
zhuxueliao 2010-09-23
  • 打赏
  • 举报
回复
看看到底哪有问题
zhuxueliao 2010-09-23
  • 打赏
  • 举报
回复
public SqlHelper()
{
strConnectionString = ConfigurationManager.ConnectionStrings["tyhy_shoppingConnectionString"].ConnectionString;
}

public int ExecuteNonQuery(string query)
{
cnn = new SqlConnection(strConnectionString);
SqlCommand cmd = new SqlCommand(query, cnn);
if (query.StartsWith("INSERT") | query.StartsWith("insert") | query.StartsWith("UPDATE") | query.StartsWith("update") | query.StartsWith("DELETE") | query.StartsWith("delete"))
{
cmd.CommandType = CommandType.Text;
}
else
{
cmd.CommandType = CommandType.StoredProcedure;
}
int retval;
cnn.Open();
SqlTransaction tran = cnn.BeginTransaction(); //事务处理
cmd.Transaction = tran;
try
{
retval = cmd.ExecuteNonQuery();
tran.Commit();
}
catch (Exception exp)
{
throw exp;
tran.Rollback();
}
finally
{
if (cnn.State == ConnectionState.Open)
{
cnn.Close();
}
tran.Dispose();
cmd.Dispose();
}
return retval;
}

public int ExecuteNonQuery(string query, params SqlParameter[] parameters)
{
cnn = new SqlConnection(ConfigurationManager.ConnectionStrings["tyhy_shoppingConnectionString"].ConnectionString);
SqlCommand cmd = new SqlCommand(query, cnn);
if (query.StartsWith("INSERT") | query.StartsWith("insert") | query.StartsWith("UPDATE") | query.StartsWith("update") | query.StartsWith("DELETE") | query.StartsWith("delete"))
{
cmd.CommandType = CommandType.Text;
}
else
{
cmd.CommandType = CommandType.StoredProcedure;
}
cnn.Open();
SqlTransaction tran = cnn.BeginTransaction(); //事务处理
cmd.Transaction = tran;
int retval;
for (int i = 0; i <= parameters.Length - 1; i++)
{
cmd.Parameters.Add(parameters[i]);
}
try
{
retval = cmd.ExecuteNonQuery();
tran.Commit();
}
catch (Exception exp)
{
throw exp;
tran.Rollback();
}
finally {

tran.Dispose();
cnn.Close();
cmd.Dispose();
}

return retval;
}

public object ExecuteScalar(string query)
{
cnn = new SqlConnection(ConfigurationManager.ConnectionStrings["tyhy_shoppingConnectionString"].ConnectionString);
SqlCommand cmd = new SqlCommand(query, cnn);
if (query.StartsWith("SELECT") | query.StartsWith("select"))
{
cmd.CommandType = CommandType.Text;
}
else
{
cmd.CommandType = CommandType.StoredProcedure;
}
cnn.Open();
object retval = cmd.ExecuteNonQuery();
cnn.Close();
return retval;
}

public object ExecuteScalar(string query, params SqlParameter[] parameters)
{
cnn = new SqlConnection(ConfigurationManager.ConnectionStrings["tyhy_shoppingConnectionString"].ConnectionString);
SqlCommand cmd = new SqlCommand(query, cnn);
if (query.StartsWith("SELECT") | query.StartsWith("select"))
{
cmd.CommandType = CommandType.Text;
}
else
{
cmd.CommandType = CommandType.StoredProcedure;
}
for (int i = 0; i <= parameters.Length - 1; i++)
{
cmd.Parameters.Add(parameters[i]);
}
cnn.Open();
object retval = cmd.ExecuteScalar();
cnn.Close();
return retval;
}

public SqlDataReader ExecuteReader(string query)
{
cnn = new SqlConnection(ConfigurationManager.ConnectionStrings["tyhy_shoppingConnectionString"].ConnectionString);
SqlCommand cmd = new SqlCommand(query, cnn);
cnn.Open();
if (query.StartsWith("SELECT") | query.StartsWith("select"))
{
cmd.CommandType = CommandType.Text;
}
else
{
cmd.CommandType = CommandType.StoredProcedure;

}
SqlDataReader dr;
try
{
dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
return dr;
}
catch (Exception ee)
{
cnn.Close();
throw ee;
}

}
public SqlDataReader ExecuteReader(string query, params SqlParameter[] parameters)
{
cnn = new SqlConnection(ConfigurationManager.ConnectionStrings["tyhy_shoppingConnectionString"].ConnectionString);
SqlCommand cmd = new SqlCommand(query, cnn);
cnn.Open();
if (query.StartsWith("SELECT") | query.StartsWith("select"))
{
cmd.CommandType = CommandType.Text;
}
else
{
cmd.CommandType = CommandType.StoredProcedure;
}
for (int i = 0; i <= parameters.Length - 1; i++)
{
cmd.Parameters.Add(parameters[i]);
}
SqlDataReader dr;
try
{
dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
return dr;
}
catch (Exception ee)
{
cnn.Close();
throw ee;
}
}

public DataSet ExecuteDataSet(string query)
{
cnn = new SqlConnection(ConfigurationManager.ConnectionStrings["tyhy_shoppingConnectionString"].ConnectionString);
SqlCommand cmd = new SqlCommand(query, cnn);
if (query.StartsWith("SELECT") | query.StartsWith("select"))
{
cmd.CommandType = CommandType.Text;
}
else
{
cmd.CommandType = CommandType.StoredProcedure;
}
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = cmd;
DataSet ds = new DataSet();
da.Fill(ds);
return ds;
}

public DataSet ExecuteDataSet(string query, params SqlParameter[] parameters)
{
cnn = new SqlConnection(ConfigurationManager.ConnectionStrings["tyhy_shoppingConnectionString"].ConnectionString);
SqlCommand cmd = new SqlCommand(query, cnn);
if (query.StartsWith("SELECT") | query.StartsWith("select"))
{
cmd.CommandType = CommandType.Text;
}
else
{
cmd.CommandType = CommandType.StoredProcedure;
}
for (int i = 0; i <= parameters.Length - 1; i++)
{
cmd.Parameters.Add(parameters[i]);
}
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = cmd;
DataSet ds = new DataSet();
da.Fill(ds);
return ds;
}

public DataTable ExecuteDataTable(string query)
{
cnn = new SqlConnection(ConfigurationManager.ConnectionStrings["tyhy_shoppingConnectionString"].ConnectionString);
SqlCommand cmd = new SqlCommand(query, cnn);
if (query.StartsWith("SELECT") | query.StartsWith("select"))
{
cmd.CommandType = CommandType.Text;
}
else
{
cmd.CommandType = CommandType.StoredProcedure;
}
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = cmd;
DataSet ds = new DataSet();
da.Fill(ds);
return ds.Tables[0];
}

public DataTable ConvertDataReaderToDataTable(IDataReader reader)
{

DataTable objDataTable = new DataTable();//创建一个DataTable对象

int intFieldCount = reader.FieldCount;

//为DataTable对象添加对应的列字段信息

for (int intCounter = 0; intCounter < intFieldCount; ++intCounter)
{

objDataTable.Columns.Add(reader.GetName(intCounter), reader.GetFieldType(intCounter));

}

objDataTable.BeginLoadData();

object[] objValues = new object[intFieldCount];

//逐行读取SqlDataReader对象中每一行数据

//并把数据添加到对象dataTable中

while (reader.Read())
{

reader.GetValues(objValues);

objDataTable.LoadDataRow(objValues, true);

}

///关闭数据读取器

reader.Close();

objDataTable.EndLoadData();

return objDataTable;//返回一个DataTable对象

}

}
代码参考有问题
zhuxueliao 2010-09-23
  • 打赏
  • 举报
回复
using System;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using System.Web;

public class SqlHelper
{
private string strConnectionString = "";
public static SqlConnection cnn;
/// <summary>
///打开数据库连接
/// </summary>
public void Open()
{
if (cnn == null)
{
cnn = new SqlConnection(ConfigurationManager.ConnectionStrings["tyhy_shoppingConnectionString"].ConnectionString);

}
if (cnn.State == ConnectionState.Closed)
{
try
{
cnn.Open();
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}

}
}

/// <summary>
/// 关闭数据库连接
/// </summary>
public void close()
{
if (cnn != null)
{
if (cnn.State == ConnectionState.Open)
{
cnn.Close();
}
}

}
/// <summary>
/// 释放资源
/// </summary>
public void Dispose()
{
// 确认连接是否已经关闭
if (cnn != null)
{
cnn.Dispose();

cnn = null;
}
}

liaoyukun111 2010-09-23
  • 打赏
  • 举报
回复
Connection cn=...
cn.open();
SqlDataRead dr...


//取数据库数据
dr.close();
cn.close();
pxynet 2010-09-23
  • 打赏
  • 举报
回复
ExecuteReader 每次用完要关闭
zhuxueliao 2010-09-23
  • 打赏
  • 举报
回复
说话呀。真急
zhuxueliao 2010-09-23
  • 打赏
  • 举报
回复
顶顶顶

62,271

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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