看到一段代码,好象是处理数据库连接及其它工作的类:
public class Database : IDisposable {
// 连接数据源
private SqlConnection con;
/// <summary>
/// 执行存储过程
/// </summary>
/// <param name="procName">存储过程的名称</param>
/// <returns>返回存储过程返回值</returns>
public int RunProc(string procName) {
SqlCommand cmd = CreateCommand(procName, null);
cmd.ExecuteNonQuery();
this.Close();
return (int)cmd.Parameters["ReturnValue"].Value;
}不清楚 : IDisposable 这个是个什么东东?
public class Database : IDisposable {
// 连接数据源
private SqlConnection con;
/// <summary>
/// 执行存储过程
/// </summary>
/// <param name="procName">存储过程的名称</param>
/// <returns>返回存储过程返回值</returns>
public int RunProc(string procName) {
SqlCommand cmd = CreateCommand(procName, null);
cmd.ExecuteNonQuery();
this.Close();
return (int)cmd.Parameters["ReturnValue"].Value;
}不清楚 : IDisposable 这个是个什么东东?
解决方案 »
- 菜鸟一个,求指导!!!关于FileUpload
- vs调试的时候有时候报错System.Data.SqlClient.SqlException: 拒绝了对对象 'sp_sdidebug'这个怎么会是啊?怎么而解决?
- 如何在不转移焦点的情况下,将一个控件的按键响应到另外一个控件?
- 新手:求一个Cookie和Session混合验证的类!检查是否是管理员!
- 如何实现:跳转之前 弹出对话框, 确定之后 跳转到指定页面
- 关于.net framework的版本问题,不知哪位注意到过?
- 这个singleton的实现错在哪里呢?
- c#.net求救
- 水晶报表如在代码中控制某一个元素的位置?
- 关于VS2005文件保存格式的问题——急
- 鼠标拖曳的状态下,在treeView上实现悬停。并在某一个节点上悬停3秒,则打开此节点下的节点
- 一个新手的问题。
定义一种释放分配的非托管资源的方法。 代码是否没有贴全呢?在继承了该接口后 应该显示的实现dispose方法才对嘛
// 连接数据源
private SqlConnection con;
/// <summary>
/// 执行存储过程
/// </summary>
/// <param name="procName">存储过程的名称</param>
/// <returns>返回存储过程返回值</returns>
public int RunProc(string procName) {
SqlCommand cmd = CreateCommand(procName, null);
cmd.ExecuteNonQuery();
this.Close();
return (int)cmd.Parameters["ReturnValue"].Value;
} /// <summary>
/// 执行存储过程
/// </summary>
/// <param name="procName">存储过程名称</param>
/// <param name="prams">存储过程所需参数</param>
/// <returns>返回存储过程返回值</returns>
public int RunProc(string procName, SqlParameter[] prams) {
SqlCommand cmd = CreateCommand(procName, prams);
cmd.ExecuteNonQuery();
this.Close();
return (int)cmd.Parameters["ReturnValue"].Value;
} /// <summary>
/// 执行存储过程
/// </summary>
/// <param name="procName">存储过程的名称</param>
/// <param name="dataReader">返回存储过程返回值</param>
public void RunProc(string procName, out SqlDataReader dataReader) {
SqlCommand cmd = CreateCommand(procName, null);
dataReader = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
//return (int)cmd.Parameters["ReturnValue"].Value;
} /// <summary>
/// 执行存储过程
/// </summary>
/// <param name="procName">存储过程的名称</param>
/// <param name="prams">存储过程所需参数</param>
/// <param name="dataReader">存储过程所需参数</param>
public void RunProc(string procName, SqlParameter[] prams, out SqlDataReader dataReader) {
SqlCommand cmd = CreateCommand(procName, prams);
dataReader = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
//return (int)cmd.Parameters["ReturnValue"].Value;
}
/// <summary>
/// 创建一个SqlCommand对象以此来执行存储过程
/// </summary>
/// <param name="procName">存储过程的名称</param>
/// <param name="prams">存储过程所需参数</param>
/// <returns>返回SqlCommand对象</returns>
private SqlCommand CreateCommand(string procName, SqlParameter[] prams) {
// 确认打开连接
Open();
SqlCommand cmd = new SqlCommand(procName, con);
cmd.CommandType = CommandType.StoredProcedure; // 依次把参数传入存储过程
if (prams != null) {
foreach (SqlParameter parameter in prams)
cmd.Parameters.Add(parameter);
}
// 加入返回参数
cmd.Parameters.Add(
new SqlParameter("ReturnValue", SqlDbType.Int, 4,
ParameterDirection.ReturnValue, false, 0, 0,
string.Empty, DataRowVersion.Default, null)); return cmd;
} /// <summary>
/// 打开数据库连接.
/// </summary>
private void Open() {
// 打开数据库连接
if (con == null) {
con = new SqlConnection(ConfigurationSettings.AppSettings["ConnectionString"]);
}
if(con.State ==System.Data.ConnectionState.Closed)
con.Open(); } /// <summary>
/// 关闭数据库连接
/// </summary>
public void Close() {
if (con != null)
con.Close();
} /// <summary>
/// 释放资源
/// </summary>
public void Dispose() {
// 确认连接是否已经关闭
if (con != null) {
con.Dispose();
con = null;
}
} /// <summary>
/// 传入输入参数
/// </summary>
/// <param name="ParamName">存储过程名称</param>
/// <param name="DbType">参数类型</param></param>
/// <param name="Size">参数大小</param>
/// <param name="Value">参数值</param>
/// <returns>新的 parameter 对象</returns>
public SqlParameter MakeInParam(string ParamName, SqlDbType DbType, int Size, object Value) {
return MakeParam(ParamName, DbType, Size, ParameterDirection.Input, Value);
} /// <summary>
/// 传入返回值参数
/// </summary>
/// <param name="ParamName">存储过程名称</param>
/// <param name="DbType">参数类型</param>
/// <param name="Size">参数大小</param>
/// <returns>新的 parameter 对象</returns>
public SqlParameter MakeOutParam(string ParamName, SqlDbType DbType, int Size) {
return MakeParam(ParamName, DbType, Size, ParameterDirection.Output, null);
} /// <summary>
/// 传入返回值参数
/// </summary>
/// <param name="ParamName">存储过程名称</param>
/// <param name="DbType">参数类型</param>
/// <param name="Size">参数大小</param>
/// <returns>新的 parameter 对象</returns>
public SqlParameter MakeReturnParam(string ParamName, SqlDbType DbType, int Size)
{
return MakeParam(ParamName, DbType, Size, ParameterDirection.ReturnValue, null);
}
/// <summary>
/// 生成存储过程参数
/// </summary>
/// <param name="ParamName">存储过程名称</param>
/// <param name="DbType">参数类型</param>
/// <param name="Size">参数大小</param>
/// <param name="Direction">参数方向</param>
/// <param name="Value">参数值</param>
/// <returns>新的 parameter 对象</returns>
public SqlParameter MakeParam(string ParamName, SqlDbType DbType, Int32 Size, ParameterDirection Direction, object Value) {
SqlParameter param; if(Size > 0)
param = new SqlParameter(ParamName, DbType, Size);
else
param = new SqlParameter(ParamName, DbType); param.Direction = Direction;
if (!(Direction == ParameterDirection.Output && Value == null))
param.Value = Value; return param;
}
}
定义一种释放分配的非托管资源的方法。
------------------------------------------------
其实也就是可继承IDisposable也可不用的,是不是就这样理解?
例如
object a = ...
//你如何在下一句释放它
a = null ?? //不能确定,只能等待gc来收拾
如果 a 实现了idisposeable
则可
a.dispose();//即可尤其是a 里如果包括一个非托管资源,比如数据库联接,文件句柄等不受框架管理的东东时,尤其重要
还有实现了这个接口,你可以用
using( youclass a = new yourclass )
{
}//到这里a 已经自动释放