Windows Server 2008 R2 上部署 SQLite 常见问题解答:
在一些轻量级项目中,我用 SQLite 替换了 Access 数据库。原因是 SQLite 轻量且备受推崇,并且其对象关系映射 (ORM) 支持比 Access 更好。
在完成本地开发和调试后,部署到 Windows Server 2008 R2 服务器时,却遇到了一些问题。本文不讨论 SQLite 的使用方法,而是专注于部署过程中的常见问题。
SQLite 应用的部署步骤通常与普通应用相同,但仍可能遇到以下问题:
1. 编译器错误 CS0246: 未能找到类型或命名空间名称“SQLite”:
请确保将 System.Data.SQLite.dll 复制到项目的 bin 目录。本地调试时,由于已添加了 SQLite 安装目录下的 dll 引用,因此可以正常运行。SQLite.NET 下载页面
2. 加载程序集错误:未能加载文件或程序集“System.Data.SQLite.Linq”或其依赖项之一。生成此程序集的运行时比当前加载的运行时新,无法加载此程序集。:
此问题通常是因为服务器未安装 .NET Framework 4.0。请注意,SQLite.NET 的不同版本对应不同的 .NET Framework 版本。请务必选择与目标框架版本匹配的 SQLite.NET 版本。安装 .NET 4.0 后,记得更改 IIS 中应用程序池的 .NET Framework 版本。
3. 加载程序集错误:未能加载文件或程序集“System.Data.SQLite.dll”或其依赖项之一。找不到指定的模块。:
此问题通常是因为未安装 Microsoft Visual C++ 2010 SP1 Redistributable Package (x64)。
4. 数据库错误:Attempt to write a read-only database:
请检查数据库文件所在目录的权限,并为 IIS_IUSRS 组添加完全控制权限。请注意,应为 IIS_IUSRS 组添加权限,而非 Users 组,因为 IIS_IUSRS 组是 IIS 工作进程使用的组,安全性更高。
5. 加载程序集错误:未能加载文件或程序集“System.Data.SQLite”或其依赖项之一。试图加载格式不正确的程序。:
此问题与问题 3 类似,但更严重。原因是使用了错误版本的 System.Data.SQLite.dll,例如在 64 位服务器上使用了 32 位 dll。解决方法有两个:一是使用正确版本的 dll;二是将 IIS 应用程序池的高级设置中的“启用 32 位应用程序”设置为 True。如果启用 32 位应用程序后出现问题 3,则需要安装 x86 版本的 Visual C++ Runtime。
注意::启用 32 位应用程序后,只能使用 32 位 dll,一个应用程序池中不能混合使用 32 位和 64 位 dll。
6. 性能问题:没有报错,但访问 SQLite 速度很慢,即使是简单的 Select 操作。:
即使是只有少量数据的数据库,查询速度也可能异常缓慢。经过测试,发现问题是由于目录权限导致的。只读操作不会报错,但性能会严重下降。解决方法同问题 4,为 IIS_IUSRS 组添加适当的权限。这可能是因为 SQLite 操作时会创建临时文件,权限受限会影响其性能。