我们在进行数据库方面的编码过程中,可能会碰见这样的问题:
已有打开的与此命令相关联的DataReader,必须首先将它关闭
比如说按如下的代码进行数据库操作:
string selStr = "select DeptNAME from Departments where deptid='" + ((CurrentUser)Session["CurrentUser"]).DeptID.ToString() + "'";
SqlConnection conn = new SqlConnection("Data Source=localhost;Initial Catalog=elearning;Integrated Security=false;uid=sa;pwd=sa;");
conn.Open();
SqlCommand comm = new SqlCommand(selStr, conn);
SqlDataReader dr = comm1.ExecuteReader();
string DeptName = string.Empty;
if (dr.Read())
{
DeptName = dr["DeptNAME"].ToString();
}
string insertStr = "insert into OnlineUsers values('" + ((CurrentUser)Session["CurrentUser"]).UserID + "','" + ((CurrentUser)Session["CurrentUser"]).RealName + "','" + DeptName + "','" + ((CurrentUser)Session["CurrentUser"]).DeptID + "')";
SqlCommand comm = new SqlCommand(insertStr, conn);
comm.ExecuteNonQuery();
这样的操作是肯定会出现上述的错误的。也会导致第二个comm.ExecuteNonQuery()无法执行
主要原因是 DataReader 在打开使用时,一个 SqlConnection 只允许打开一个 DataReader,在开启另一个 DataReader 时,必须将前面一个先 Close 掉,
虽然第一个comm执行的是插入数据操作,但是还是会调用上一个SqlConnection和Sqlcommand
在使用数据库更新或插入语句时,大家通常使用 SqlCommand 的 ExecuteNonQuery() 方法,并且前提是定义了一个公共的数据库连接(如果每次查询时都生成新连接的话不会存在这个问题,但那样数据库占用的资源相对会高很多),在ExecuteNonQuery() 后,内部会生成一个空的 DataReader 对象,并当当前的数据库连接关闭掉后,该 DataReader 才会释放。因此在大家使用更新方法时,推荐使用 using 关键字,它作为语句,可以将它所定义范围内的对象都释放掉。
相关代码如下:
using (SqlCommand sqlcmd = new SqlCommand(sql, conn))
{
try
{
sqlcmd.CommandTimeout = 300;
sqlcmd.ExecuteNonQuery();
iResult = 1;
}
catch (Exception ex)
{
}
finally
{
}
已有打开的与此命令相关联的DataReader,必须首先将它关闭
比如说按如下的代码进行数据库操作:
string selStr = "select DeptNAME from Departments where deptid='" + ((CurrentUser)Session["CurrentUser"]).DeptID.ToString() + "'";
SqlConnection conn = new SqlConnection("Data Source=localhost;Initial Catalog=elearning;Integrated Security=false;uid=sa;pwd=sa;");
conn.Open();
SqlCommand comm = new SqlCommand(selStr, conn);
SqlDataReader dr = comm1.ExecuteReader();
string DeptName = string.Empty;
if (dr.Read())
{
DeptName = dr["DeptNAME"].ToString();
}
string insertStr = "insert into OnlineUsers values('" + ((CurrentUser)Session["CurrentUser"]).UserID + "','" + ((CurrentUser)Session["CurrentUser"]).RealName + "','" + DeptName + "','" + ((CurrentUser)Session["CurrentUser"]).DeptID + "')";
SqlCommand comm = new SqlCommand(insertStr, conn);
comm.ExecuteNonQuery();
这样的操作是肯定会出现上述的错误的。也会导致第二个comm.ExecuteNonQuery()无法执行
主要原因是 DataReader 在打开使用时,一个 SqlConnection 只允许打开一个 DataReader,在开启另一个 DataReader 时,必须将前面一个先 Close 掉,
虽然第一个comm执行的是插入数据操作,但是还是会调用上一个SqlConnection和Sqlcommand
在使用数据库更新或插入语句时,大家通常使用 SqlCommand 的 ExecuteNonQuery() 方法,并且前提是定义了一个公共的数据库连接(如果每次查询时都生成新连接的话不会存在这个问题,但那样数据库占用的资源相对会高很多),在ExecuteNonQuery() 后,内部会生成一个空的 DataReader 对象,并当当前的数据库连接关闭掉后,该 DataReader 才会释放。因此在大家使用更新方法时,推荐使用 using 关键字,它作为语句,可以将它所定义范围内的对象都释放掉。
相关代码如下:
using (SqlCommand sqlcmd = new SqlCommand(sql, conn))
{
try
{
sqlcmd.CommandTimeout = 300;
sqlcmd.ExecuteNonQuery();
iResult = 1;
}
catch (Exception ex)
{
}
finally
{
}