FreeSql icon indicating copy to clipboard operation
FreeSql copied to clipboard

如何手工关闭数据库连接?

Open ismlsmile opened this issue 1 year ago • 10 comments

Test项目中,操作了一个sqlite文件后,想在代码中直接删除,但报文件被占用,删除失败。使用fsql.Dispose()无效。请问如何手工关闭数据库连接?

ismlsmile avatar Dec 19 '23 06:12 ismlsmile

SqliteConnection.ClearAllPools();

2881099 avatar Dec 19 '23 08:12 2881099

测试了下不行,文件还是无法删除

ismlsmile avatar Dec 19 '23 08:12 ismlsmile

能不能通过fsql对象拿到原始的SqliteConnection对象?

ismlsmile avatar Dec 19 '23 08:12 ismlsmile

拿到之后要怎么操作?我忘了之前有人操作过你的问题。

2881099 avatar Dec 19 '23 08:12 2881099

拿到之后手工Close,之前用Dapper的时候这么弄没有问题,文件可以删除

ismlsmile avatar Dec 19 '23 08:12 ismlsmile

你先测一下原生 ado.net 怎么释放

2881099 avatar Dec 19 '23 08:12 2881099

这个测试过,就是Close方法 image

ismlsmile avatar Dec 19 '23 08:12 ismlsmile

我刚回退到之前的Dapper代码,测试了也不行。一度怀疑之前记错了。经过一番验证,目前结论如下: 核心原因是和Sqlite驱动有关,FreeSql.Provider.SqliteCore死活不行,而FreeSql.Provider.Sqlite是可以的。所以本质还是Microsoft.Data.Sqlite和System.Data.Sqlite驱动的区别,前面回退到Dapper不行,是因为中间变过驱动。

经验证,FreeSql通过下面方式创建连接: SQLiteConnection conn = new SQLiteConnection("Data Source=XXX.db"); IFreeSql fsql = new FreeSql.FreeSqlBuilder().UseConnectionFactory(FreeSql.DataType.Sqlite, () => conn).Build();

然后在执行完相关数据库操作后: conn.Close()

sqlite文件可以正常删除,前提是使用FreeSql.Provider.Sqlite驱动,用FreeSql.Provider.SqliteCore则不行

ismlsmile avatar Dec 19 '23 10:12 ismlsmile

FreeSql.Provider.Sqlite 3.2.807-preview20231219

用这个版本试试

2881099 avatar Dec 19 '23 10:12 2881099

FreeSql.Provider.Sqlite本来就可以的吧

ismlsmile avatar Dec 19 '23 10:12 ismlsmile