Spiga

不被重视的基础,简单高效地使用ADO.net连接对象

2011-12-17 01:19 by 张剑, 2971 visits, 收藏, 编辑

很多初学者朋友在做项目时遇到过这样的问题,那就是在本地调试运行的程序正常,放到服务器上也是正常的,但是如果有了一些并发之后,就会发现页面会出现打不开的现像,其实大多数时候是因为Ado.net链接没有处理完善。当然对于老鸟来说这种情况是不会发生的。

其实避免出现这种情况和提高Connection对象的使用性能的方式很简单,我们这里列出两种方式供初学者或遇到过这种问题的朋友选择:

1.使用try-catch-finally语句块:

        SqlConnection conn = new SqlConnection("链接字符串");
try
{
conn.Open();//打开数据库链接

//添写针对链接对象所做的一些操作
}
catch (SqlException err)
{
//这里可以将错误信息写入日志
}
finally
{
conn.Close();//在完成conn对象的操作后需要关闭链接
}

    这么做的原因是,虽然.NET框架中有垃圾回收机制,但是我们为了能确保资源的有效利用,所以需要尽早的释放到资源,以保证其能被有效的利用起来。同时,我们也不建议大家直接在操作完成后使用conn.Close()方法,因为这样的话,如果在本次操作出现错误后,conn将不再继续往下执行,那么意味着链接就不会关闭,其结果是你第二次操作时,将来提示链接没有被关闭。

2.也可使用using语句块:

        using (SqlConnection conn = new SqlConnection("链接字符串"))
{
conn.Open();
//添写针对链接对象所做的一些操作
}

    有兴趣的朋友,可以去研究一下using关健字在C#中的各种用法,那么在这里using所起到的作用是不论如何退出语句块,都会释放到conn对象的资源。

    当然,我的建议是大家可以结合起来使用,因为using对象可以确保资源的释放,而try语句块可以让我们抓取异常,并且写到Log中。

Add your comment

24 条回复

  1. #1楼 水月无痕      2011-12-17 08:53
    看来我是菜鸟了!
     回复 引用 查看   
  2. #2楼 牛腩      2011-12-17 09:30
    一直都是这么写滴。。。。
     回复 引用 查看   
  3. #3楼 SingleX      2011-12-17 09:56
    using 的飘过
     回复 引用 查看   
  4. #4楼 assiwe      2011-12-17 10:45
    菜鸟的时候也没犯过这种错误.微软的示例和DBhelper都是using.
     回复 引用 查看   
  5. #5楼 Astar      2011-12-17 10:52
    前两天团队里还有人犯这样的错误。
     回复 引用 查看   
  6. #6楼 A_明~坚持      2011-12-17 11:12
    菜鸟路过!改了!
     回复 引用 查看   
  7. #7楼 Mr Yang      2011-12-17 12:58
    o(︶︿︶)o 这个。。。。。。楼主拿精华来!
     回复 引用 查看   
  8. #8楼 Ref Tian      2011-12-17 15:18
    呵呵呵 这都能放首页?~~~~~~~~~~
     回复 引用 查看   
  9. #9楼[楼主] 张剑      2011-12-17 15:23
    @Mr Yang
    也许对于初学者来说,这个应该比较重要吧。
     回复 引用 查看   
  10. #10楼[楼主] 张剑      2011-12-17 15:25
    @Ref Tian
    其实这么简单的东西,并不一定大家都会这样去做,比如确定在项目的异常处理结果会放入到Log中?
     回复 引用 查看   
  11. #11楼 porschev      2011-12-17 16:25
    如果是单纯比较异常处理,当然是try...catch结构,
    如果单纯比较释放资源,using也更清晰,也更省事
    using如果没记错的话,,,他来身其实就是个try..finally的结构。。

    如果在项目中,其实个人认为LZ的两者结合用,看起来代码结构复杂了点。。。我一般会选择用try..catch...finally加正确的实现:IDisposable接口。。。。
     回复 引用 查看   
  12. #12楼 陈运江      2011-12-17 17:03
    楼主果然牛 精华啊
     回复 引用 查看   
  13. #13楼 y.beiying      2011-12-17 17:40
    /// <summary>
    /// 执行查询返回xmlDocument()
    /// </summary>
    /// <param name="sql">sql语句</param>
    /// <returns>string类型</returns>
    public string GetXmlReader(string sql)
    {
    String xmlReader = "";
    using (SqlCommand cmd = new SqlCommand(sql, Con))
    {
    try
    {
    XmlReader xml = cmd.ExecuteXmlReader();
    while (xml.ReadState != ReadState.EndOfFile)
    {
    xmlReader += xml.ReadOuterXml();
    }
    }
    catch
    {
    cmd.Connection.Close();
    }
    finally
    {
    cmd.Connection.Close();
    }
    }
    return xmlReader;
    }

    我们一直是这样用的,各位帮看看是否有问题。
     回复 引用 查看   
  14. #14楼[楼主] 张剑      2011-12-17 17:42
    @y.beiying
    catch{}语句块中不需要做close操作,finally都已经做过了,你可以在这里做一些关于错误日志文件的记录。
     回复 引用 查看   
  15. #15楼 y.beiying      2011-12-17 17:48
    谢了
     回复 引用 查看   
  16. #16楼 y.beiying      2011-12-17 17:49
    using ,try.没有冲突吧
     回复 引用 查看   
  17. #17楼[楼主] 张剑      2011-12-17 17:51
    @y.beiying
    没有冲突。
     回复 引用 查看   
  18. #18楼 Bill Basilone      2011-12-17 23:39
    这样就上了精华,让我情何以堪啊…………
     回复 引用 查看   
  19. #19楼 浩GE      2011-12-17 23:44
    一直都是这么写的。。以前是照着写,后来明白了。。
     回复 引用 查看   
  20. #20楼 么有爱情的色鬼      2011-12-18 22:38
    using 等效 try{}catch{}finally{}
    二个用一个就行吧。。。
    如果重复是不是不好呢?
     回复 引用 查看   
  21. #21楼[楼主] 张剑      2011-12-18 22:50
    @么有爱情的色鬼
    虽然using关健字语句块中存在异常后可以调用Dispose()方法,但是你无法在异常时对异常的信息进行处理。如果你使用Reflector可以查看到Dispose()方法会检查对象链接是否为打开状态,然后再去Close()。当然我所提出只是一种建议,try-catch-finally语句块能抓取异常并写入日志,而using可以作为一种良好的编程习惯和对象释放的保证。
     回复 引用 查看   
  22. #22楼 么有爱情的色鬼      2011-12-18 23:41
    @张剑
    可以说using只是一种语法糖了;
    用 try{}catch{}finally{} 同样的实现了;
    不知道,在同时使用上面两个的情况下与只使用一个上有多大区别!
     回复 引用 查看   
  23. #23楼 疯狂五四      2011-12-19 10:19
    msdn上的例子,都是大把大把的using啊,看着头晕。
     回复 引用 查看   
  24. #24楼 顾晓北      2011-12-21 15:08
    using.
     回复 引用 查看