c#关于数据库操作注意事项

原文在此处:C#资源释放方法与原理总结_class helloPte的博客-CSDN博客_c#释放资源

由于最近在做一些C#连接数据库的程序,所以记录一下遇到的问题和需要注意的地方。

一、垃圾回收的问题

①托管资源

.NET中的所有类型都是(直接或间接)从System.Object类型派生的。 通用类型系统(CTS)区分两种基本类型:值类型和引用类型。它们之间的根本区别在于它们在内存中的存储方式。.NET使用两种不同的物理内存快来存储数据------栈和托管堆

img

值类型在栈里,先进后出,值类型变量的生命有先后顺序,这个确保了值类型变量在退出作用域以前会释放资源。比引用类型更简单和高效。堆栈是从高地址往低地址分配内存。

引用类型分配在托管堆(Managed Heap)上,声明一个变量在栈上保存,当使用new创建对象时,会把对象的地址存储在这个变量里。托管堆相反,从低地址往高地址分配内存,如图:

img

②非托管资源

ApplicationContext, Brush, Component, ComponentDesigner, Container, Context, Cursor, FileStream, Font, Icon, Image, Matrix, Object, OdbcDataReader, OleDBDataReader, Pen, Regex, Socket, StreamWriter, Timer, Tooltip, 文件句柄, GDI资源, 数据库连接等等资源。

托管资源:并不需要显示释放,但是如果引用类型本身含有非托管资源,则需要进行现实释放。 非托管资源:需要显式释放的,也即需要你写代码释放。

所以一般在.Net中托管资源是不需要我们去手动释放的,我们只需要对非托管资源进行释放即可。

.Net提供了三种释放资源的方法: 1、继承IDisposable接口,使用Dispose()方法:

 public void ExcuteCommand(string connectString, string commandString)
     {
         SqlConnection myConnection = new SqlConnection(connectString);
         SqlCommand myCommand = new SqlCommand(commandString, myConnection);
         myConnection.Open();
         myCommand.ExecuteNonQuery();
         myCommand.Dispose();
         myConnection.Dispose();
 }

确保非托管资源会释放的最好方法是使用using或者try/finally。 在C#中使用using是释放非托管的最好方法,因为在using执行完成的时候,会自动调用Dispose()方法释放资源

using(SqlConnection myConnection = new SqlConnection(connectString)) {   myConnection.Open(); } 

也可以使用try/catch/finally语句块, 确保在finally块中关闭任何已打开的连接。

try { 
    SqlConnection myConnection = new SqlConnection(connectString); 
    myConnection.Open(); 
} 
catch { // } 
finally {undefined myConnection.Dispose(); }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值