繁体   English   中英

使用陈述后,Sqlite数据库保持打开状态并且文件被锁定

[英]Sqlite database remains open and File locked after using statment

我在一些sqlite代码上遇到了问题,似乎下面的函数中的某些问题导致数据库在应该由using语句关闭后仍保持打开状态,我可以通过调用GC.collect解决该问题。 ()在调用函数中,但我想尝试找出问题的原因。 我已经尝试在使用语句之后添加对GC.Collect()的调用,但这似乎还不够,假设某些东西阻止了GC的清理,asm会发生吗?

    /// <summary>
    /// Gets the Points of Interest for a given Category
    /// </summary>
    /// <param name="rootPath">Target Path</param>
    /// <param name="category">Category to search</param>
    /// <returns>A collection of Points of interest</returns>
    public static Collection<PointOfInterest> GetPointsOfInterest(string rootPath, PointOfInterestCategory category)
    {
        if (category == null)
        {
            throw new ArgumentNullException("category");
        }

        Collection<PointOfInterest> pointsOfInterest = new Collection<PointOfInterest>();

        string databaseLocation = string.Format(Resources.DataFilePath, rootPath, "poidata.db");
        using (SQLiteConnection connection = new SQLiteConnection(string.Format("Data Source={0};Version=3;", databaseLocation)))
        {
            connection.Open();
            using (SQLiteCommand command = new SQLiteCommand(
                "SELECT latmin + (latmax - latmin / 2) as lat, lonmin + (lonmax - lonmin / 2) as lon, city, street, housenr, name FROM poicoord JOIN poidata ON poicoord.poiid = poidata.poiid JOIN poiname on poiname.docid = poicoord.poiid WHERE type = @category",
                connection))
            {
                command.Parameters.Add(new SQLiteParameter("category", DbType.Int32) { Value = category.Id });

                SQLiteDataReader reader = command.ExecuteReader();

                int latOrdinal = reader.GetOrdinal("lat");
                int lonOrdinal = reader.GetOrdinal("lon");
                int nameOrdinal = reader.GetOrdinal("name");
                int houseNrOrdinal = reader.GetOrdinal("housenr");
                int streetOrdinal = reader.GetOrdinal("street");
                int cityOrdinal = reader.GetOrdinal("city");

                while (reader.Read())
                {
                    pointsOfInterest.Add(new PointOfInterest()
                    { 
                        Latitude = reader.GetDouble(latOrdinal), 
                        Longitude = reader.GetDouble(lonOrdinal),
                        Name = reader.GetString(nameOrdinal),
                        HouseNumber = reader.IsDBNull(houseNrOrdinal) ? string.Empty : reader.GetString(houseNrOrdinal),
                        Street = reader.IsDBNull(streetOrdinal) ? string.Empty : reader.GetString(streetOrdinal),
                        City = reader.IsDBNull(cityOrdinal) ? string.Empty : reader.GetString(cityOrdinal),
                    });
                }
            }
        }

        return pointsOfInterest;
    }

尝试实现using语句,而不只是将阅读器分配给变量:

using (SQLiteDataReader reader=command.ExecuteReader()) {
    ...
}

或手动关闭阅读器:

reader.Close();

暂无
暂无

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

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