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

2025-03-01 18:42:55
推荐回答(3个)
回答1:

稍微标准点的写法

SqlConnection cn = null;
SqlCommand cmd = null;
SqlDataReader dr = null;

cn = new SqlConnection();
cn.ConnectionString = "data source=.;initial catalog=oa;integrated security=sspi";
cmd = new SqlCommand("select 是否已阅 from Msg where 收信人='" + b + "' and 是否已阅 ='否'", cn);

try
{
cn.Open();
SqlDataReader dr = cmd.ExecuteReader();
if (dr != null)
{
if (dr.Read())
{
Label1.Text = dr.GetString(0).ToString();
Label6.Text = "您有新短信,请注意查收!";
}
}
}
catch (Exception ex)
{
Response.Write(ex.Message);
}
finally
{
if (dr != null) dr.Close();
if (cmd != null) cmd.Dispose();
if (cn != null) cn.Dispose();
}

程序还有很多问题不规范

比如
select 是否已阅 from Msg where 收信人='" + b + "' and 是否已阅 ='否'"
==
既然知道条件是 是否已阅 ='否',那就根本没必要 select 是否已阅...
改成
select 1 from Msg where 收信人='" + b + "' and 是否已阅 ='否'"即可

再比如
刚才使用的是拼接sql语句,已经基本被摒弃了,网上搜搜"参数化语句"和"sql注入"就知道了

回答2:

SqlConnection cn = new SqlConnection();
cn.ConnectionString = "data source=.;initial catalog=oa;integrated security=sspi";
cn.Open();
SqlCommand cmd = new SqlCommand("select 是否已阅 from Msg where 收信人='" + b + "' and 是否已阅 ='否'",cn );
using(SqlDataReader dr = cmd.ExecuteReader())
{
try{
dr.Read();
Label1.Text = dr.GetString(0).ToString();
dr.Close();
Label6.Text = "您有新短信,请注意查收!";
}catch{}
}
con.Close();
//光给代码不知道你看得懂不....也没什么好说的,楼上几位把该说的都说完了....

回答3:

改为:SqlDataReader dr=cmd.ExecuteReader(); if(){}将两次执行改为一次,因为两次的执行冲突,if()括号里的执行语句还未关闭.