.net求助啊,有没有大神 !报错:已有打开的与此命令相关联的 DataReader,必须首先将它关闭。

publicstaticSqlDataReaderGetReader(stringsafeSql){SqlCommandcmd=newSqlCommand(safeSql... public static SqlDataReader GetReader(string safeSql)
{
SqlCommand cmd = new SqlCommand(safeSql, Connection);
SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
return reader;
connection.Close();
}

public static SqlDataReader GetReader(string sql, params SqlParameter[] values)
{

SqlCommand cmd = new SqlCommand(sql, Connection);
cmd.Parameters.AddRange(values);
(这行报错) SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
return reader;
connection.Close();
}
展开
 我来答
OfferComing留学
2022-12-24 · OfferComing一站式留学攻略
OfferComing留学
向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;

}

Tech_Monkeye5
2018-04-25 · TA获得超过984个赞
知道小有建树答主
回答量:330
采纳率:92%
帮助的人:79.5万
展开全部
这两个函数有何用处?
DataReader在读取数据时要求连接必须打开!如果关闭连接,然后返回的DataReader有什么作用?第二个方法更是奇怪,connection的参数从哪个里的?
然后再说一下你的错误:
你在IDE中难道connection.Close();语句下没有红色波浪线吗?别说没有,我不信——因为return之后的语句根本不会执行!所以IDE会提示你该语句不会被执行,所以会存在红色波浪线!两个方法中都是先return,然后“关闭”,其实吧,这句关闭的代码没有任何机会被执行的——return都跳出成员方法了,还有谁会执行return以后的语句呢?!
你可能想反驳我的是——“我用着好好的啊”,那是因为我在代码基础上告诉你关闭连接之后DataReader没有用!但是你可能以为关闭连接之后有用——其实你的那个connection.Close();放在那里一点做用都没启动!好了,现在你知道你的两个方法是有问题!
你可能知道——在同一个connection上是不能有两个Reader的——因为Reader对Connection是独占的,直到reader关闭!当然,事务也是一样的,对于connection上是不可能叠加事务的!也正是这个原因,你以为你在执行第一个方法后关闭了连接,第二个在执行时应该没有任何问题——但事实上你执行第一个方法后根本没有关闭连接!第二个方法执行时当然会告诉你——重复的reader。你知道第二个方法出现了错误——其实你先执行第二个再执行第一个,第一个会发生错误!不信你可以试试!
另外,cmd增加参数最好别这么玩——cmd.Parameters.Clear();之后再增加参数,否则你会遇到各种各样的问题的——你不信不怕,总有时间你会遇到!当然,我不反对你增加数组的参数,但好呆判断一下!params可变参数说明,你这个数组可能会是null——你直接cmd.Parameters.Add(null);这个语句肯定会发生错误的!
反正吧,这两个细节问题太多了——基本这两个成员方法没有任何用处!而且告诉你一个规则:MSDN告诉我们——慎用静态类!基本上这种业务上出现的静态类基本玩完!这也是我说这两个成员方法没有任何价值的原因!
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式