教材部分代码:
定义GetTable:
/// <summary>
/// 使用此方法可以得到数据集
/// </summary>
/// <param name="sql">SQL语句</param>
/// <returns>方法返回数据集</returns>
public DataSet GetTable(string sql)
{
SqlDataAdapter sda = new SqlDataAdapter(sql, conn);//创建数据适配器对象
DataSet ds = new DataSet();//创建数据集
sda.Fill(ds);//填充数据集
ds.Dispose();//释放资源
return ds;//返回数据集
}
调用GetTable:
public partial class frmMain : Form
{
public frmMain()
{
InitializeComponent();
}
public string User;//声明用户名称字段
public string Logintime;//声明登陆时间字段
DBOperate operate = new DBOperate();//创建数据库操作对象
private void frmMain_Load(object sender, EventArgs e)
{
toolStripStatusLabel2.Text = User;//显示用户名
toolStripStatusLabel5.Text = Logintime;//显示登陆时间
toolStripMenuItem1.Text = DateTime.Now.ToLongTimeString();//显示系统时间
string sql = "select * from tb_User where UserName='"+User+"'";//设置数据库查询字符串
DataSet ds = operate.GetTable(sql);//得到数据集
string power = ds.Tables[0].Rows[0][3].ToString();//得到用户权限字符串
if (power == "一般用户")//判断用户权限
{
系统管理ToolStripMenuItem.Enabled = false;//停用系统管理菜单
操作员管理ToolStripMenuItem.Enabled = false;//停用操作员管理菜单
}
}
......
}
在主窗体代码中调用GetTable,结果显示能得到具体的数据集,说明运行方法GetTable时,ds.Dispose()语句并没有
立马释放资源,没有对ds做任何处理,而是将此任务交给GC。对于Dispose(),教材上所谓的“释放资源”,实际上只
针对非托管资源,会立马释放资源。而对托管资源调用Dispose(),实际上是无效的,最后还得由GC全权处理!
个人觉得,上述代码(ds.Dispose())是无实际意义的
定义GetTable:
/// <summary>
/// 使用此方法可以得到数据集
/// </summary>
/// <param name="sql">SQL语句</param>
/// <returns>方法返回数据集</returns>
public DataSet GetTable(string sql)
{
SqlDataAdapter sda = new SqlDataAdapter(sql, conn);//创建数据适配器对象
DataSet ds = new DataSet();//创建数据集
sda.Fill(ds);//填充数据集
ds.Dispose();//释放资源
return ds;//返回数据集
}
调用GetTable:
public partial class frmMain : Form
{
public frmMain()
{
InitializeComponent();
}
public string User;//声明用户名称字段
public string Logintime;//声明登陆时间字段
DBOperate operate = new DBOperate();//创建数据库操作对象
private void frmMain_Load(object sender, EventArgs e)
{
toolStripStatusLabel2.Text = User;//显示用户名
toolStripStatusLabel5.Text = Logintime;//显示登陆时间
toolStripMenuItem1.Text = DateTime.Now.ToLongTimeString();//显示系统时间
string sql = "select * from tb_User where UserName='"+User+"'";//设置数据库查询字符串
DataSet ds = operate.GetTable(sql);//得到数据集
string power = ds.Tables[0].Rows[0][3].ToString();//得到用户权限字符串
if (power == "一般用户")//判断用户权限
{
系统管理ToolStripMenuItem.Enabled = false;//停用系统管理菜单
操作员管理ToolStripMenuItem.Enabled = false;//停用操作员管理菜单
}
}
......
}
在主窗体代码中调用GetTable,结果显示能得到具体的数据集,说明运行方法GetTable时,ds.Dispose()语句并没有
立马释放资源,没有对ds做任何处理,而是将此任务交给GC。对于Dispose(),教材上所谓的“释放资源”,实际上只
针对非托管资源,会立马释放资源。而对托管资源调用Dispose(),实际上是无效的,最后还得由GC全权处理!
个人觉得,上述代码(ds.Dispose())是无实际意义的
而不通过该方法,那么就会等到垃圾回收扫描到这个引用不存在了才回收,这个时间和资源效率上都不如上面的。
StreamWriter,DataTable.DataSet等为什么有这种说法?http://topic.csdn.net/t/20060815/17/4951582.html关注中、、、一个睡觉去