已有打开的与此命令相关联的 DataReader,必须首先将它关闭。

publicclassDBHelper{privatestaticSqlConnectionconnection;publicstaticSqlConnectionCon... public class DBHelper
{
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,必须首先将它关闭
展开
 我来答
OfferComing留学
2022-12-22 · OfferComing一站式留学攻略
OfferComing留学
向TA提问
展开全部

DataReader 在打开使用时,一个 SqlConnection 只允许打开一个 DataReader,在开启另一个 DataReader 时,必须将前面一个先 Close 掉。

1、使用数据库更新或插入语句时,通常用 SqlCommand 的 ExecuteNonQuery() 方法,并且定义了一个公共的数据库连接,每次查询时都生成新连接不会有这个问题,但会占用高的数据库资源。

2、这种情况下,内部会生成一个空的 DataReader 对象,当前的数据库连接关闭掉后,该 DataReader 才会释放,因此在推荐使用 using 关键字,可以将它所定义范围内的对象都释放掉。

3、也可以设定ConnectionString,直接加上MultipleActiveResultSets=true语句,只适用于SQL 2005之后的版本,先读出放置在List中。

4、改为下图代码之后,ToList之后就被读到内存中了,与DataContext脱钩了。

很多游戏
高粉答主

2019-10-14 · 游戏精通者,攻略技能点满
很多游戏
采纳数:91 获赞数:386977

向TA提问 私信TA
展开全部

主要原因是 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;

}

本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
灵性真知圈
推荐于2017-11-22 · TA获得超过143个赞
知道小有建树答主
回答量:346
采纳率:0%
帮助的人:167万
展开全部
你的sqlDataReader未关闭吧
1, dataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
加上CommandBehavior.CloseConnection这个枚举
2,在界面引用此类方法的时候用using
using(SqlDataReader dr =DBHelper.SqlDataReader (""))
{
//处理代码
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
漂泊的_狼
2010-01-19
知道答主
回答量:12
采纳率:0%
帮助的人:0
展开全部
罚你去面壁思过!!!嘿嘿
一看就没认真看书,
datareaser使用的时候会保持与数据库的连接,如果不手动关闭会一直占着,下次打开就会有问题
可以在调用GetReader()方法的地方这样写
using(sqldatareader datareader=helper. GetReader(条件)){
操作

这样就会自动关闭连接,高枕无忧
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
yyf6767667
2019-03-05
知道答主
回答量:54
采纳率:100%
帮助的人:4.3万
展开全部
你的这个问题出现在连接字符串上,在上面加上MultipleActiveResultSets=true,就可以了。其意义为:将数据库连接设置可复用,即可供多个SqlCommand同时使用。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(12)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式