【发布时间】:2011-06-25 02:58:35
【问题描述】:
我使用SqlCE 与Windows-Mobile and Windows-CE 合作,但我不知道该怎么做。
要在程序打开时打开连接,运行任何查询的...更新...删除数据库并在程序关闭后关闭连接?
或者打开连接运行任何查询的..update...删除数据库并立即关闭连接?
【问题讨论】:
标签: c# windows-mobile windows-ce sql-server-ce
我使用SqlCE 与Windows-Mobile and Windows-CE 合作,但我不知道该怎么做。
要在程序打开时打开连接,运行任何查询的...更新...删除数据库并在程序关闭后关闭连接?
或者打开连接运行任何查询的..update...删除数据库并立即关闭连接?
【问题讨论】:
标签: c# windows-mobile windows-ce sql-server-ce
很好。答案无处不在。以下是我从经验和与 SQL Compact 团队的互动中了解到的:
所以答案实际上是两者兼而有之。
编辑
对于那些感兴趣的人,可以在OpenNETCF ORM library 中看到如何工作的一个很好的例子。默认情况下,该库创建一个保持打开状态的“维护”连接,用于执行模式查询等操作。所有其他数据操作都使用它们自己的连接。您还必须选择将库配置为在 Store 的整个生命周期内重复使用单个连接,或者在每次触及 Store 时使用新连接。在我使用默认值的所有项目中,性能和行为一直是最好的(这就是我将其设为默认值的原因)。
【讨论】:
在 Windows Mobile 应用的整个生命周期内始终保持连接打开。打开 SQL Server Compact 数据库是一项昂贵的操作。
【讨论】:
您应该在每次完成 sql 事务以释放连接端口时关闭连接。始终是避免安全漏洞的好习惯。
【讨论】:
连接建立是一个缓慢的操作,因此,创建和关闭它会降低应用程序的速度。相反,如果你有很多客户端,连接池会很快被填满,其他客户端将无法连接。
【讨论】:
这里已经有一些相互矛盾的答案。
说实话,我不太确定 WinCE 如何处理连接。我认为没有 ConnectionPool。
但 .NET 中的一般模式是保持连接尽可能短。这提高了可靠性并防止了资源泄漏。确保您了解using (var conn = ...) { ... } 模式。
所以我会说:选择第二个选项,只有在您确实遇到性能问题并且打开连接是原因时才保持连接更长时间。我不认为它会与 SqlCE 一起使用
【讨论】:
在 wince 等单用户平台上,保持连接打开并没有什么坏处,而且您可能会获得更好的性能。
【讨论】:
如果担心由于您不经常调用Close() 而导致数据丢失,您可以在立即将更改提交到磁盘的事务中执行您的代码:
using (SqlCeTransaction transaction = this.connection.BeginTransaction())
{
using (SqlCeCommand command = new SqlCeCommand(query, connection))
{
command.Transaction = transaction;
command.ExecuteNonQuery();
}
transaction.Commit(CommitMode.Immediate);
}
当然,如果过于频繁地使用CommitMode.Immediate,还是会损失一些性能。
【讨论】: