繁体   English   中英

使用Statement和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对象都会被立即处置? 我在整个项目中都使用这种方法,并且在一次操作中有很多这样的调用时,我会收到“内存不足”错误。

编辑:经过一些个人调查后,我发现,实际上,适配器的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)那里获得: 信用到期

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM