日期:2014-05-20  浏览次数:20475 次

ItemDataBound事件中语句错在什么地方,总是提示SqlDataReader没有关闭
private   void   DataGrid1_ItemDataBound(object   sender,   System.Web.UI.WebControls.DataGridItemEventArgs   e)
{
if(e.Item.ItemType   ==   ListItemType.Item   ||   e.Item.ItemType   ==ListItemType.AlternatingItem)
{
DataRowView   row   =   e.Item.DataItem   as   DataRowView;
string   dt   =   row[ "P_ID "].ToString();
SqlConnection   con   =   DB.createCon();
con.Open();
string   StrSql= "select   *   from   dragoman   where   P_ID= ' "+dt+ " ' ";
SqlCommand   cmd   =   new   SqlCommand(StrSql,con);
SqlDataReader   sdr   =   cmd.ExecuteReader();
string   savename= " ";
if(sdr.Read())
{
while(sdr.Read())
{
string   setID   =   sdr.GetValue(1).ToString();
string   StrCmd   =   "select   *   from   ciceroni   where   ID= ' "+setID+ " ' ";
SqlCommand   cmd1   =   new   SqlCommand(StrCmd,con);
SqlDataReader   sdr1   =   cmd1.ExecuteReader();
savename=savename+sdr1.GetValue(1).ToString();
e.Item.Cells[7].Text=StrCmd;

}
}
else
{
Response.Write( "暂无 ");
}
     
}

------解决方案--------------------
SqlDataReader使用完之后要关闭,否则conn一直处于open状态,检查一下你是否没有将conn.open后没有conn.close就有执行conn.open了?
------解决方案--------------------
同一conn,dr一定要先关闭conn才可以再用
就是说要dr.close();dr=null;
------解决方案--------------------
你那个做法不行,dr里面又有dr,而且用同一conn,建多一个conn吧。
或者换个方法,在sql query下功夫。
------解决方案--------------------
string StrSql= "select * from dragoman a ";
" left join ciceroni b on a.id=b.id ";
" where P_ID= ' "+dt+ " ' "

这样用一个dr就行了
------解决方案--------------------
代码看起来很有问题
SqlConnection con = DB.createCon();后面又没马上释放,这样行有多少条数据,,便生成多少个连接...连接池的错误提示可能离此不远了..
最好把定义放外面去..

下面的代码也要关闭一下连接:
while(sdr.Read())
{
string setID = sdr.GetValue(1).ToString();
string StrCmd = "select * from ciceroni where ID= ' "+setID+ " ' ";
SqlCommand cmd1 = new SqlCommand(StrCmd,con);
SqlDataReader sdr1 = cmd1.ExecuteReader();
savename=savename+sdr1.GetValue(1).ToString();
e.Item.Cells[7].Text=StrCmd;
sdr1.Close();

}
sdr.Close();
con.Close();
..................无功劳也有苦劳..记得给点分哦...