![](https://iknow-base.cdn.bcebos.com/lxb/notice.png)
已有打开的与此命令相关联的 DataReader,必须首先将它关闭。
{
private static SqlConnection connection;
public static SqlConnection Connection
{
get
{
string connectionString = ConfigurationManager.ConnectionStrings["JcodeConnectionStrings"].ConnectionString;
if (connection == null)
{
connection = new SqlConnection(connectionString);
connection.Open();
}
else if (connection.State == System.Data.ConnectionState.Closed)
{
connection.Open();
}
else if (connection.State == System.Data.ConnectionState.Broken)
{
connection.Close();
connection.Open();
}
return connection;
}
}
//取所有记录
public static DataView GetTableData(string sqlString)
{
SqlDataAdapter da = new SqlDataAdapter(sqlString,Connection);
DataSet ds = new DataSet();
da.Fill(ds, "Jcode");
return ds.Tables["Jcode"].DefaultView;
}
/// <summary>
/// 实例化sqlCommand对象返回sqlDataReader
/// </summary>
/// <param name="safeSql"></param>
/// <returns></returns>
public static SqlDataReader GetReader(string safeSql)
{
SqlCommand cmd = new SqlCommand(safeSql, Connection);
SqlDataReader reader = cmd.ex.ExecuteReader();
return reader;
}
public static SqlDataReader GetReader(string sql, params SqlParameter[] values)
{
SqlCommand cmd = new SqlCommand(sql, Connection);
cmd.Parameters.AddRange(values);
SqlDataReader reader = cmd.ExecuteReader();
return reader;
}
public static int ExcuteCommand(string sql)
{
SqlCommand cmd = new SqlCommand(sql, Connection);
int result=cmd.ExecuteNonQuery();
return result;
}
**************************
行 54: {
行 55: SqlCommand cmd = new SqlCommand(safeSql, Connection);
行 56: SqlDataReader reader = cmd.ExecuteReader();
行 57: return reader;
行 58: }
InvalidOperationException: 已有打开的与此命令相关联的 DataReader,必须首先将它关闭 展开
DataReader 在打开使用时,一个 SqlConnection 只允许打开一个 DataReader,在开启另一个 DataReader 时,必须将前面一个先 Close 掉。
1、使用数据库更新或插入语句时,通常用 SqlCommand 的 ExecuteNonQuery() 方法,并且定义了一个公共的数据库连接,每次查询时都生成新连接不会有这个问题,但会占用高的数据库资源。
2、这种情况下,内部会生成一个空的 DataReader 对象,当前的数据库连接关闭掉后,该 DataReader 才会释放,因此在推荐使用 using 关键字,可以将它所定义范围内的对象都释放掉。
3、也可以设定ConnectionString,直接加上MultipleActiveResultSets=true语句,只适用于SQL 2005之后的版本,先读出放置在List中。
4、改为下图代码之后,ToList之后就被读到内存中了,与DataContext脱钩了。
主要原因是 DataReader 在打开使用时,一个 SqlConnection 只允许打开一个 DataReader,在开启另一个 DataReader 时,必须将前面一个先 Close 掉。
1、首先输入代码:
private static string strConn = ConfigurationManager.ConnectionStrings["SQLLSB2008"].ConnectionString;
private static SqlConnection myConn = null;
private static SqlDataAdapter myAdapter = new SqlDataAdapter(); private static SqlCommand myCmd = new SqlCommand();
private static DataTable myTable = new DataTable();
2、然后输入下方的代码:
public static DataTable returnDataTable(string mySql, SqlParameter[] parameters)
{
myConn = new SqlConnection(strConn);
using (myCmd = new SqlCommand(mySql, myConn))
{
try
{
myCmd.Parameters.AddRange(parameters);
myAdapter = new SqlDataAdapter(myCmd);
myTable.Clear();
myAdapter.Fill(myTable);
}
3、然后输入下方的代码,就可以解决问题了:
catch
{
connClose();
}
finally
{
connClose();
}
}
return myTable;
}
1, dataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
加上CommandBehavior.CloseConnection这个枚举
2,在界面引用此类方法的时候用using
using(SqlDataReader dr =DBHelper.SqlDataReader (""))
{
//处理代码
}
一看就没认真看书,
datareaser使用的时候会保持与数据库的连接,如果不手动关闭会一直占着,下次打开就会有问题
可以在调用GetReader()方法的地方这样写
using(sqldatareader datareader=helper. GetReader(条件)){
操作
}
这样就会自动关闭连接,高枕无忧