47

我正在使用这段代码:

    public void InsertMember(Member member)
    {
        string INSERT = "INSERT INTO Members (Name, Surname, EntryDate) VALUES (@Name, @Surname, @EntryDate)";

        using (sqlConnection = new SqlConnection(sqlConnectionString_WORK))
        {
            sqlConnection.Open();

            using (SqlCommand sqlCommand = new SqlCommand(INSERT, sqlConnection))
            {
                sqlCommand.Parameters.Add("@Name", SqlDbType.VarChar).Value = member.Name;
                sqlCommand.Parameters.Add("@Surname", SqlDbType.VarChar).Value = member.Surname;
                sqlCommand.Parameters.Add("@EntryDate", SqlDbType.Date).Value = member.EntryDate;

                sqlCommand.ExecuteNonQuery();
            }
        }
    }

sqlConnection.Close();如果我在处理它之前不添加它是错误的吗?我是说。它没有显示任何错误,完全没有问题。最好先关闭它吗?如果是,为什么?

4

7 回答 7

54

无需阻止即可Close or Disposeusing您处理。

正如MSDN所述:

下面的示例创建一个 SqlConnection,打开它,显示它的一些属性。连接在 using 块结束时自动关闭。

private static void OpenSqlConnection(string connectionString) 
{
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        connection.Open();
        Console.WriteLine("ServerVersion: {0}", connection.ServerVersion);
        Console.WriteLine("State: {0}", connection.State);
    } 
}
于 2013-09-03T09:00:24.710 回答
11

using statement ensures that Dispose is called即使您在对象上调用方法时发生异常。You can achieve the same result by putting the object inside a try block and then calling Dispose in a finally block; 事实上,编译器就是这样翻译 using 语句的。MSDN

所以最终你的代码行

  using (sqlConnection = new SqlConnection(sqlConnectionString_WORK))

try finally block将通过编译器调用转换为正常IDisposable object in the finally

于 2013-09-03T12:17:36.000 回答
8

根据该方法的MSDN 文档Close

您必须通过调用CloseDispose显式关闭连接。CloseDispose在功能上是等效的。

因此,调用Dispose(隐含地,甚至使用using)将覆盖你的基础,就像它一样。

值得注意的是,我认为,虽然不是特定于您的情况,但当事物被包装在语句中时,它Close总是会被有效地调用- 如果它被省略并且没有正确的//发生异常,则可能不是这种情况处理。usingtrycatchfinally

于 2013-09-03T09:02:08.150 回答
5

如果我不添加 sqlConnection.Close(); 是不是错了?在处理它之前

不,只要您在Using. 当您离开使用范围时,Dispose将调用 sql 连接。这将关闭现有连接并释放所有资源。

于 2013-09-03T09:02:54.783 回答
4

using 语句是一个 try finally 块,在您的情况下,最终块将有一个connection.Dispose()调用。所以你真的不需要一个独立的connection.Close()声明。

优点是即使在出现异常的情况下也能确保处理,因为 finally 块将始终运行。

try
{
sqlConnection.Open();
// ....
}
finally
{
if(sqlConnection != null)
      sqlConnection.Dispose();
}
于 2013-09-03T09:05:17.383 回答
3

不,这没有错。sqlConnection 将在通过using块并调用 Dispose 方法后关闭连接。SqlConnection.Dispose() 等于 SqlConnection.Close() 方法。

来自 MSDN:如果 SqlConnection 超出范围,则不会关闭。因此,您必须通过调用 Close 或 Dispose 显式关闭连接。Close 和 Dispose 在功能上是等效的。

于 2013-09-03T09:00:51.067 回答
3

您正在使用Using哪个将为Dispose()您提供对象。

如果您在Using语句之外进行连接,那么是的 - 您需要在完成后关闭连接。

于 2013-09-03T09:01:54.907 回答