当使用以下方式时,“使用”的用途是什么

时间:2010-06-17 06:03:59

标签: c# sql connection using-directives

使用以下方式时“使用”的用途是什么: -

这是一个例子,(一个答案 - @richj - 用这个代码来解决问题)

private Method(SqlConnection connection)
{
    using (SqlTransaction transaction = connection.BeginTransaction())
    {
        try
        {
            // Use the connection here
            ....

            transaction.Commit();
        } 
        catch
        {
            transaction.Rollback();
            throw;
        }
    }
}

其他示例我在MICROSOFT支持网站上阅读时发现

public static void ShowSqlException(string connectionString)
{
    string queryString = "EXECUTE NonExistantStoredProcedure";
    StringBuilder errorMessages = new StringBuilder();

    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        SqlCommand command = new SqlCommand(queryString, connection);
        try
        {
            command.Connection.Open();
            command.ExecuteNonQuery();
        }
        catch (SqlException ex)
        {
            for (int i = 0; i < ex.Errors.Count; i++)
            {
                errorMessages.Append("Index #" + i + "\n" +
                    "Message: " + ex.Errors[i].Message + "\n" +
                    "LineNumber: " + ex.Errors[i].LineNumber + "\n" +
                    "Source: " + ex.Errors[i].Source + "\n" +
                    "Procedure: " + ex.Errors[i].Procedure + "\n");
            }
            Console.WriteLine(errorMessages.ToString());
        }
    }
}

我在页面顶部使用system.data.sqlclient等,所以为什么在代码中间使用东西,

如果我省略它(我知道代码可以工作)但我会失去什么功能

5 个答案:

答案 0 :(得分:6)

当您离开using()块时,您的连接将被关闭或执行类似的清理任务。这是通过调用对象的Dispose()方法来实现的。

答案 1 :(得分:5)

直接来自MSDN:

using (Font font1 = new Font("Arial", 10.0f)) 
{
  byte charset = font1.GdiCharSet;
}

等同于:

{
  Font font1 = new Font("Arial", 10.0f);
  try
  {
    byte charset = font1.GdiCharSet;
  }
  finally
  {
    if (font1 != null)
      ((IDisposable)font1).Dispose();
  }
}

这是一种更简洁,更简洁的说法:我想使用我为各种奇妙的东西创造的东西,我希望框架在我完成它时清理我的操场。

它通常用于分配资源的类(Streams,Database connections ...),因为在完成这些资源后,您可能会忘记或忽略释放这些资源。 使用using,您无法与资源管理协调一致,而且您很可能不会泄漏资源。

P.S。另一个using(在using System.Web中)是using directive,我正在谈论的是using statement

答案 2 :(得分:5)

我认为您指的是using关键字的两种不同用法。

当(通常)在文件的顶部时,它声明导入命名空间。请参阅"using Directive"

using System.Collections;

namespace XYZ
{
}

当在函数内部声明时,它声明一个有限的生命周期和可能的范围(如果同时声明)变量,以便在块关闭后自动调用它的IDisposable接口。请参阅"using Statement"

public void MyMethod()
{
    using (var conn = new SqlConnection(...))
    {
         // Do stuff
    }
}

是否等同于:

public void MyMethod()
{
    SqlConnection conn;
    try
    {
        conn = new SqlConnection(...);
        // Do stuff
    }
    finally
    {
        conn.Dispose();
    }
}

答案 3 :(得分:2)

在幕后,它将您的代码包装在try / finally块中,并在finally块中调用IDiposable.Dispose(),以确保清除所有资源。

基本上它可以让你省去头痛:

SqlTransaction transaction = connection.BeginTransaction();

try
{ 
  //some code;
}
finally
{
  transaction.Dispose();
}

答案 4 :(得分:1)

正如Thief Master所说 - 当退出using块时,SQLTransaction或SQLConnection将被关闭。无论是通过退货退出还是抛出异常。

如果省略使用,则必须自行关闭事务/连接。通过使用系统自动为您执行此操作。