class1
public static SqlDataReader ExecuteReader(string cmdText,commandbehavior cb)
{
SqlConnection conn = new SqlConnection();
conn.ConnectionString = "连接字符串";
conn.open();
try
{
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = cmdText;
return cmd.executereader(cb);
}
catch
{
conn.close();
throw;
}
}调用
using(SqlDataReader sdr=class1.ExecuteReader(strSql,commandbehavior.closeconnection))
{
while(sdr.read())
{
//处理....
}
if(!sdr.isclose) sdr.close();
}手上没源码,代码手写的,,可能有个别错误在class1.ExecuteReader方法中也没有关闭conn
问题:偶尔会出现 阅读器关闭时READ的尝试无效 错误
public static SqlDataReader ExecuteReader(string cmdText,commandbehavior cb)
{
SqlConnection conn = new SqlConnection();
conn.ConnectionString = "连接字符串";
conn.open();
try
{
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = cmdText;
return cmd.executereader(cb);
}
catch
{
conn.close();
throw;
}
}调用
using(SqlDataReader sdr=class1.ExecuteReader(strSql,commandbehavior.closeconnection))
{
while(sdr.read())
{
//处理....
}
if(!sdr.isclose) sdr.close();
}手上没源码,代码手写的,,可能有个别错误在class1.ExecuteReader方法中也没有关闭conn
问题:偶尔会出现 阅读器关闭时READ的尝试无效 错误
不想做太多的重复工作,class1作为一个基本操作的方法
是啊,,只是偶尔会出现,,
{
SqlConnection conn = new SqlConnection();
conn.ConnectionString = "连接字符串";
try
{
conn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = cmdText;
return cmd.ExecutRreader(cb);
}
catch
{
if (conn.State == System.Data.ConnectionState.Open)
conn.Close();
throw;
}
}调用
首先建一个和数据库对应的实体类,
public ArrayList getlist()
{
ArrayList list = new list();
string strSql = "select 列1,列2,列3 from table1";
using(SqlDataReader sdr=class1.ExecuteReader(strSql,CommandBehavior.CloseConnection))
{
while(sdr.read())
{
实体类 m = new 实体类();
m.列1=sdr.getValue(0).ToString();
m.列2=sdr.getValue(1).ToString();
m.列3=sdr.getValue(2).ToString();
list.add(m);
}
if(!sdr.IsClosed)sdr.Close();
}
return list;
}是在vs.net2003下的,代码没什么技术性的东西,手上现在也没源码,不过代码大概也就是这样的, 因为出现这种错误的地方也不指一处,只要用到while(sdr.read())就有可能会出现这样的错误,如果只指读一行的话,就没出现过这样错误
if (conn.State == System.Data.ConnectionState.Open)
conn.Close();
这时候返回Reader时,连接是关闭的,就会抛出"阅读器关闭时READ的尝试无效 "的异常...试着这样改下:public static SqlDataReader ExecuteReader(string cmdText, CommandBehavior cb)
{
SqlConnection conn = new SqlConnection();
conn.ConnectionString = "server=.;database=student;uid=sa;pwd=0421";
try
{
conn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = cmdText;
return cmd.ExecuteReader(cb);
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
ArrayList list = new ArrayList();
string strSql = "select * from studentDetails";
try
{
using (SqlDataReader sdr = ExecuteReader(strSql, CommandBehavior.CloseConnection))
{
while (sdr.Read())
{
list.Add(sdr["sname"].ToString());
}
if (!sdr.IsClosed) sdr.Close();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
我之前也是没加if(!sdr.IsClosed)sdr.Close(),发现性能不太好,还是自己手动关一下好点,再者加那句,也是read完之后的,那也就不会抛出那个错误
to:liujia_0421(SnowLover)
问题是:刷新一下就不会出现了
而且sqlconnection也只是在出错时才关闭就是出错了,那也就是抛出一个sql错误,抛出错误了,就不会再去read()的了吧!
为什么刷新一下,就不会错的呢!
using(SqlDataReader sdr=class1.ExecuteReader(strSql,commandbehavior.closeconnection))
这样的USING的用法,括号里的资源在语句结束之后会自动释放资源,所以,
上面的SDR会自动关闭释放掉,但是你的CON不在此语句自动释放之类,你自己研究下
commandbehavior.closeconnection:当sqldatareader释放掉了之后,就会关闭掉sqlconnection
我原本也是没在using里面关闭sqldatareader的,但那也会出现这种错误的
我想会发生这种错误,也不关我在using里关闭sqldatareader的事
commandbehavior.closeconnection
只在关闭 DataReader 对象,则关联的 Connection 对象也将关闭而不是read完之后,就去关掉Connection对象
再者我是在while(sdr.read())这个循环完之后(也就是read完了)才关闭sqldatareader对象using()内的对象(也就是sqldatareader)也会自动调用Dispose方法,只不过我自己在用完之后就关闭掉sqldatareader对象
那样的话就得改死人了有没有帮忙处理一下的高手???
SqlDataReader sdr= null;
using()
{
conn = new SqlConnection();
conn.ConnectionString = "连接字符串";
conn.open();
try
{
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = cmdText;
sdr = cmd.executereader(cb);
while(sdr.read())
{
//处理....
}
}
finally
{
if (conn.State == System.Data.ConnectionState.Open)
conn.Close(); }}
什么才叫read用完??
只有关闭了sqldatareader对象时,关联的sqlconnection对象也将关闭
to:fwqfwq()
sqlconnection对象关闭了的,你可以去看看关于commandbehavior.closeconnection的帮助