我可以用这种方法有效?

using(SqlCommand cmd = new SqlCommand("GetSomething", new SqlConnection(Config.ConnectionString))
{
    cmd.Connection.Open();
    // set up parameters and CommandType to StoredProcedure etc. etc.
    cmd.ExecuteNonQuery();
}

我关切的是:会的处理方法的SqlCommand(被称为退出时使用的方框)关闭基础象或没有?

有帮助吗?

解决方案

不,处理 SqlCommand 不会影响的连接。一个更好的办法是也包裹 SqlConnection 在采用区块,以及:

using (SqlConnection conn = new SqlConnection(connstring))
{
    conn.Open();
    using (SqlCommand cmd = new SqlCommand(cmdstring, conn))
    {
        cmd.ExecuteNonQuery();
    }
}

否则,连接是不变的事实,一个命令,该命令是使用它的设置(可能也就是你想要什么?).但请记住,连接应 被设置为好,并且可能更重要的处置于命令。

编辑:

我只是测试这样的:

SqlConnection conn = new SqlConnection(connstring);
conn.Open();

using (SqlCommand cmd = new SqlCommand("select field from table where fieldid = 1", conn))
{
    Console.WriteLine(cmd.ExecuteScalar().ToString());
}

using (SqlCommand cmd = new SqlCommand("select field from table where fieldid = 2", conn))
{
    Console.WriteLine(cmd.ExecuteScalar().ToString());
}

conn.Dispose();  

第一命令被置当使用框退出。连接仍然是开放和良好的第二命令。

因此,处理的命令的肯定不处置的连接,这是使用。

其他提示

SqlCommand.处分是不够的,因为许多SqlCommand(s)可以(重新)使用相同和.集中你的注重和.

我使用这个模式。我有个私人的方法的地方,在我的应用程序:

private void DisposeCommand(SqlCommand cmd)
{
    try
    {
        if (cmd != null)
        {
            if (cmd.Connection != null)
            {
                cmd.Connection.Close();
                cmd.Connection.Dispose();
            }
            cmd.Dispose();
        }
    }
    catch { } //don't blow up
}

然后我总是创建SQL命令和连接在一试块(但没有被包裹在一个使用方框),并始终有一个最后框为:

    finally
    {
        DisposeCommand(cmd);
    }

连接的对象的财产的命令对象的使用框尴尬在这种情况,但这种模式能够完成任务没有打乱你的代码。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top