这样操作ExecuteReader 对吗
以下是写的两个关于ExecuteReader执行,不知道这样操作有没有问题,请大家指导/// <summary>
/// SqlDataReader非参数
/// </summary>
/// <param name="SPName"></param>
/// <returns></returns>
public static SqlDataReader ExecuteReader(string SPName)
{
using (SqlConnection cnn = new SqlConnection(ConnectionString))
{
SqlCommand cmd = new SqlCommand("", cnn);
SqlDataReader reader = new SqlDataReader();
try
{
cnn.Open();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = SPName;
reader = cmd.ExecuteReader();
return reader;
}
catch (Exception ex)
{
System.Console.WriteLine(ex.Message);
}
finally
{
reader.Close();
reader.Dispose();
cnn.Close();
}
}
}
/// <summary>
/// SqlDataReader参数
/// </summary>
/// <param name="alListItem"></param>
/// <param name="SPName"></param>
/// <returns></returns>
public static SqlDataReader ExecuteReader(ArrayList alListItem, string SPName)
{
using (SqlConnection cnn = new SqlConnection(ConnectionString))
{
SqlCommand cmd = new SqlCommand("", cnn);
SqlDataReader reader = new SqlDataReader();
try
{
SqlDataAdapter adapter = new SqlDataAdapter();
cnn.Open();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = SPName;
SqlParameter[] SqlParameter = DBParameters.GetParameters(alListItem, SPName);
foreach (SqlParameter pt in SqlParameter)
{
cmd.Parameters.Add(pt);
}
reader = cmd.ExecuteReader();
return reader;
}
catch (Exception ex)
{
System.Console.WriteLine(ex.Message);
}
finally
{
reader.Close();
reader.Dispose();
cnn.Close();
}
}
} --------------------编程问答-------------------- 发错地方了,建议转到C#区 --------------------编程问答-------------------- 友情提醒,如果不会转的话,请联系管理员或者,把这个帖子结了,然后再去C#区发一个
--------------------编程问答-------------------- 谢谢楼主,已经转过来了 --------------------编程问答-------------------- 谢谢楼上,已经转过来了 --------------------编程问答-------------------- 发现以下几个问题。第一个解决了。
1、SqlDataReader reader = new SqlDataReader();改成SqlDataReader reader;
2、并非所有代码路径都返回值
3、reader.Close();reader.Dispose();使用了未赋值的局部变量 --------------------编程问答-------------------- 使用using的话,到最后会默认调用Dispose(),而using会自动调用Close()释放资源,所以无需在using中写conn.Close()。reader.Dispose()好像也不需要,GC会自动处理的。 --------------------编程问答-------------------- “而using会自动调用Close()释放资源” 改为“而Dispose()会自动调用Close()释放资源” --------------------编程问答-------------------- 上面代码如何调整能正常运行。 --------------------编程问答-------------------- 错误代码,因为用了using,即已经释放了资源 --------------------编程问答-------------------- 代码改成以下,但是还是有问题,usering 不能用于sqlsatareader,所以用的reader.Dispose();,
1、并非所有代码路径都返回值
2、reader.Dispose();使用了未赋值的局部变量
/// <summary>
/// SqlDataReader非参数
/// </summary>
/// <param name="SPName"></param>
/// <returns></returns>
public static SqlDataReader ExecuteReader(string SPName)
{
using (SqlConnection cnn = new SqlConnection(ConnectionString))
{
SqlCommand cmd = new SqlCommand("", cnn);
SqlDataReader reader ;
try
{
cnn.Open();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = SPName;
reader = cmd.ExecuteReader();
return reader;
}
catch (Exception ex)
{
System.Console.WriteLine(ex.Message);
}
finally
{
reader.Dispose();
}
}
} --------------------编程问答-------------------- using 相当于dispose(); --------------------编程问答-------------------- finally
{
reader.Dispose();
}
为撒要dispose呢?你这样就不管什么情况都不dispose了。你这个方法什么都返回不了。finally是无条件执行的。 --------------------编程问答-------------------- SqlCommand cmd = new SqlCommand("", cnn);这个你的存储过程名字都没有设置。执行了有什么意义呢?
要用reader 别用存储过程。用select 语句。 --------------------编程问答-------------------- cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = SPName;
这是存储过程 --------------------编程问答-------------------- finally
{
reader.Dispose();
}
这句不要的。你在外面不用返回结果吗? --------------------编程问答-------------------- 我个人觉得不应该返回IDataReader....因为DataReader是联机操作,势必涉及到使用完之后的清理工作,常见的问题就是用完了reader却没有把connection关闭,导致内存泄漏,我觉得用Lamda表达式把操作包裹起来比较好
try
{
using(IDataReader reader=new ...)
{
action(reader);
if(!reader.IsClosed)
{
reader.Close();
}
}
}
catch
{
throw;
}
finally
{
...//释放数据库对象
} --------------------编程问答-------------------- 并非所有代码路径都返回值
public static SqlDataReader ExecuteReader(string SPName)
{
using (SqlConnection cnn = new SqlConnection(ConnectionString))
{
SqlCommand cmd = new SqlCommand("", cnn);
SqlDataReader reader;
try
{
cnn.Open();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = SPName;
reader = cmd.ExecuteReader();
return reader;
}
catch (Exception ex)
{
System.Console.WriteLine(ex.Message);
}
}
} --------------------编程问答-------------------- 请不要直接返回SqlDataReader,如果一定要返回它,你必须在函数参数里传入SqlConnection对象,保证数据库连接是外部传入,并在SqlDataReader使用完毕后才关闭的,如果是你函数内部创建SqlConnection对象,那么你无法确定该对象何时关闭,如果函数返回时就关闭了,那么SqlDataReader将不可用,同理,SqlDataReader对象也不能关闭,否则你返回的是一个已经释放的SqlDataReader对象,如何操作?
补充:.NET技术 , C#