使用语句和 ADO.NET 对象
using Statement And ADO.NET Objects
考虑以下方法...
private string[] GetExistingPOWSNumbers()
{
using (
var OleAdapter =
new OleDbDataAdapter(
"SELECT DISTINCT con_num FROM `Items` WHERE con_num LIKE 'POWS%'",
ConfigurationManager.ConnectionStrings["MPOleConnectionString"].ConnectionString))
using (var POWSTable = new DataTable())
{
OleAdapter.SelectCommand.Connection.Open();
OleAdapter.Fill(POWSTable);
return POWSTable.AsEnumerable().Select(row => Convert.ToString(row["con_num"])).ToArray();
}
}
所有 ADO.NET 物品都被及时处理了吗?我在我的整个项目中都使用这种方法,当在单个操作中进行了很多这样的调用时,我收到 "Out of Memory" 错误。
编辑: 经过一些个人调查后,我发现,事实上,适配器的 using 语句也不会关闭提供的集合。我做了以下更改。现在我使用 DataReader 而不是填充 DataTable。
private string[] GetExistingPOWSNumbers()
{
var Results = new List<string>();
using (var OleConnection = new OleDbConnection(ConfigurationManager.ConnectionStrings["MPOleConnectionString"].ConnectionString))
using (
var OleCommand =
new OleDbCommand(
"SELECT DISTINCT con_num FROM `Items` WHERE con_num LIKE 'POWS%'",
OleConnection))
{
OleConnection.Open();
using (var OleReader = OleCommand.ExecuteReader(CommandBehavior.CloseConnection))
{
if (OleReader == null) return new string[0];
while (OleReader.Read())
{
Results.Add(OleReader.GetString(0));
}
}
}
return Results.ToArray();
}
当对象不再被使用并且垃圾收集器认为合适时,它们将被清理。有时,您可能需要将对象设置为 null
以使其超出范围(例如不再需要其值的静态字段),但总体而言通常不需要设置为 null
.
关于处置对象,我同意@Andre。如果对象是 IDisposable
,当您不再需要它时 处置它 是个好主意,尤其是当对象使用非托管资源时。不处理非托管资源将导致内存泄漏。
您可以使用 using
语句在程序离开 using
语句的范围后自动释放对象。
using (MyIDisposableObject obj = new MyIDisposableObject())
{
// use the object here
} // the object is disposed here
在功能上等同于:
MyIDisposableObject obj;
try
{
obj = new MyIDisposableObject();
}
finally
{
if (obj != null)
{
((IDisposable)obj).Dispose();
}
}
从 Zach Johnson 那里得到这个:Credit Due
考虑以下方法...
private string[] GetExistingPOWSNumbers()
{
using (
var OleAdapter =
new OleDbDataAdapter(
"SELECT DISTINCT con_num FROM `Items` WHERE con_num LIKE 'POWS%'",
ConfigurationManager.ConnectionStrings["MPOleConnectionString"].ConnectionString))
using (var POWSTable = new DataTable())
{
OleAdapter.SelectCommand.Connection.Open();
OleAdapter.Fill(POWSTable);
return POWSTable.AsEnumerable().Select(row => Convert.ToString(row["con_num"])).ToArray();
}
}
所有 ADO.NET 物品都被及时处理了吗?我在我的整个项目中都使用这种方法,当在单个操作中进行了很多这样的调用时,我收到 "Out of Memory" 错误。
编辑: 经过一些个人调查后,我发现,事实上,适配器的 using 语句也不会关闭提供的集合。我做了以下更改。现在我使用 DataReader 而不是填充 DataTable。
private string[] GetExistingPOWSNumbers()
{
var Results = new List<string>();
using (var OleConnection = new OleDbConnection(ConfigurationManager.ConnectionStrings["MPOleConnectionString"].ConnectionString))
using (
var OleCommand =
new OleDbCommand(
"SELECT DISTINCT con_num FROM `Items` WHERE con_num LIKE 'POWS%'",
OleConnection))
{
OleConnection.Open();
using (var OleReader = OleCommand.ExecuteReader(CommandBehavior.CloseConnection))
{
if (OleReader == null) return new string[0];
while (OleReader.Read())
{
Results.Add(OleReader.GetString(0));
}
}
}
return Results.ToArray();
}
当对象不再被使用并且垃圾收集器认为合适时,它们将被清理。有时,您可能需要将对象设置为 null
以使其超出范围(例如不再需要其值的静态字段),但总体而言通常不需要设置为 null
.
关于处置对象,我同意@Andre。如果对象是 IDisposable
,当您不再需要它时 处置它 是个好主意,尤其是当对象使用非托管资源时。不处理非托管资源将导致内存泄漏。
您可以使用 using
语句在程序离开 using
语句的范围后自动释放对象。
using (MyIDisposableObject obj = new MyIDisposableObject())
{
// use the object here
} // the object is disposed here
在功能上等同于:
MyIDisposableObject obj;
try
{
obj = new MyIDisposableObject();
}
finally
{
if (obj != null)
{
((IDisposable)obj).Dispose();
}
}
从 Zach Johnson 那里得到这个:Credit Due