我在处理我的ODBCConnection

时间:2011-06-02 14:42:29

标签: c# .net odbc using

我正在使用这样的辅助方法:

    private OdbcCommand GetCommand(string sql)
    {
        string conString = "blah";
        var con = new OdbcConnection(conString);
        var cmd = new OdbcCommand(sql, con);
        return cmd;
    }

然后我像这样使用它:

using (var cmd = GetCommand("select * from myTable")
{
    cmd.connection.open();
    using(var reader = cmd.ExecuteReader())
    {
    }
}

这是第二个例子:

    public static OdbcDataReader GetReader(string conString,string sql)
    {
        var cmd = GetCommand(conString, sql);
        cmd.Connection.Open();
        return cmd.ExecuteReader();
    }

像这样使用:

     using(var reader = GetReader("blah","select * from blah")
    {
    }

在这两种情况下,我是否处理了连接和cmd对象?我认为第一个连接没有被处理掉,第二个连接和cmd都没有,是吗?

我是否需要做很长的事情来确保正确处理,或者是否采用更短的方法?

using (var con ...)
    using (var cmd)
        using (var reader)

2 个答案:

答案 0 :(得分:8)

简而言之,如果它有Dispose,那么你应该调用它。你不能假设另一个对象会处理你为它传递的对象。

处理命令对象时,不会释放连接对象,因为完成命令后可以再次使用该连接。处理每种方法是最好的方法。

答案 1 :(得分:4)

对于将Reader包装在using块中的两个示例,如果使用接受CommandBehavior的覆盖并将其设置为“CloseConnection”,则将关闭与现有代码的连接

using(var reader = cmd.ExecuteReader(CommandBehavior.CloseConnection)){}

请参阅http://msdn.microsoft.com/en-us/library/s9bz2k02.aspx

Microsoft知道在阅读器被使用时连接必须保持打开状态,因此创建了关闭Reader时关闭连接的选项。

在第二个示例中,命令没有处理,这是正确的。