使用以下方式时“使用”的用途是什么: -
这是一个例子,(一个答案 - @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等,所以为什么在代码中间使用东西,
如果我省略它(我知道代码可以工作)但我会失去什么功能
答案 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将被关闭。无论是通过退货退出还是抛出异常。
如果省略使用,则必须自行关闭事务/连接。通过使用系统自动为您执行此操作。