我在处理我的ODBCConnection

Pau*_*sey 3 .net c# odbc using

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

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

然后我像这样使用它:

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

这是第二个例子:

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

像这样使用:

     using(var reader = GetReader("blah","select * from blah")
    {
    }
Run Code Online (Sandbox Code Playgroud)

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

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

using (var con ...)
    using (var cmd)
        using (var reader)
Run Code Online (Sandbox Code Playgroud)

kem*_*002 8

简而言之,如果有Dispose,那么你应该调用它.您不能假设另一个对象将处置您为其传递的对象.

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


mdi*_*bio 5

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

using(var reader = cmd.ExecuteReader(CommandBehavior.CloseConnection)){}
Run Code Online (Sandbox Code Playgroud)

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

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

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