c#

位置:IT落伍者 >> c# >> 浏览文章

C#高级编程:数据库连接[2]


发布日期:2021年12月11日
 
C#高级编程:数据库连接[2]
——此文章摘自《C#高级编程(第版)》定价元 特价元 购买

catch ( Exception ex )

{

// Do something about the exception

}

finally

{

// Ensure that the connection is freed

connClose ( ) ;

}

在finally块中可以释放已经使用的任何资源这种方式的惟一麻烦是必须确保关闭连接很容易忘记在finally块中添加关闭连接的命令所以应在编码风格上添加一些不容易出现反常情况的内容

另外在给定的方法中可能会打开许多资源(例如两个数据库连接和一个文件)这样try…catch…finally块的层次有时可能不容易看懂但还有另一个方式可以确保资源的关闭—— 使用using语句

第二种方式—— 使用using语句块

在开发C#的过程中NET在对象不再引用之后清理它们的方法是使用非决定性的析构方式这已经引起了一个非常热烈的讨论

在C++中对象只要使用完毕就会自动调用其析构函数这对于设计基于资源的类的人员来说是一个非常好的消息因为如果用户忘记关闭资源使用析构函数是非常理想的只要对象使用完毕就会调用C++析构函数所以如果出现了异常但没有捕获有析构函数的所有对象就会调用它们的析构函数

在C#和其他托管语言中没有自动决定性的析构方式而是有一个垃圾收集器它会在未来的某个时刻释放资源它是非决定性的因为我们不能确定这个过程在什么时候发生忘记关闭数据库连接可能会导致NET可执行程序的各种问题幸运的是我们还有解决的方法下面的代码说明了如何使用using子句确保实现IDisposable接口(详见第章)的对象在退出块时立即被释放

string source = server=(local)\\NetSDK; + integrated security=SSPI; +database=Northwind;

using ( SqlConnection conn = new SqlConnection ( source ) )

{

// Open the connection

connOpen ( ) ;

// Do something useful

}

在这个示例中无论块是如何退出的using子句都会确保关闭数据库连接

查看一下连接类的Dispose()方法的IL代码它们都检查连接对象的当前状态如果其状态为打开就调用Close()方法浏览NET程序集的一个强大工具是Reflector(可以从/wwwaistocom/roeder/dotnet/上获得)这个工具允许查看任何NET方法的IL代码还可以把IL代码反编译为源代码让我们轻松地确定给定的方法的作用

在编程时应至少使用这两个方法中的一个或者两个方法都使用无论在哪里获得资源最好都使用using ()语句因为尽管我们都会编写Close()语句但有时会忘记此时using子句就会发挥作用这两种方式都没有好的异常处理方式来替代所以在大多数情况下最好组合使用这两种方法如下面的示例所示

try

{

using (SqlConnection conn = new SqlConnection ( source ))

{

// Open the connection

connOpen ( ) ;

// Do something useful

// Close it myself

connClose ( ) ;

}

}

catch (Exception e)

{

// Do something with the exception here

}

这里显式调用了Close()但这是不必要的因为using子句将确保在任何情况下都执行关闭操作但是应确保像这样的资源尽可能早地释放因为在块的其余部分可能有更多的代码而在这些地方没有必要锁定资源

另外如果在using块中出现了异常using子句就会确保在资源上调用IDisposableDispose方法在本例中将确保总是关闭数据库连接这样与必须确保在异常子句中关闭连接相比代码的可读性更高

最后如果编写一个封装资源的类无论该资源是什么都应实现IDisposable接口关闭资源这样任何使用该类的代码都可以利用using()语句以确保资源被释放

[] []

               

上一篇:C#高级编程:数据库连接[1]

下一篇:ADO.NET和ADO的比较