.NET环境下如何为SQLite/SpatiaLite设置SPATIALITE_SECURITY环境变量
解决.NET中设置SPATIALITE_SECURITY环境变量的问题
你之前尝试用SQL的SET命令设置SPATIALITE_SECURITY是无效的,因为这个变量是SpatiaLite加载时读取的进程级环境变量,不是SQLite的会话变量,必须在加载SpatiaLite扩展之前设置才能生效。
正确的做法是在打开SQLite连接前,先设置当前进程的环境变量,再执行扩展加载操作:
// 关键:在创建并打开SQLite连接前设置环境变量 Environment.SetEnvironmentVariable("SPATIALITE_SECURITY", "relaxed", EnvironmentVariableTarget.Process); using (var connection = new SqliteConnection($"Data Source={_dbPath}")) { connection.Open(); connection.EnableExtensions(true); using var command = connection.CreateCommand(); // 加载SpatiaLite扩展(此时会读取已设置的环境变量) command.CommandText = "SELECT load_extension('mod_spatialite')"; command.ExecuteNonQuery(); // 现在可以正常使用全部SpatiaLite功能 }
注意事项
- 使用
EnvironmentVariableTarget.Process仅对当前应用进程生效,不会修改系统或用户的全局环境变量,避免影响其他程序。 - 如果你的
mod_spatialite库不在系统默认搜索路径中,需要在load_extension里指定完整路径,比如Windows下的C:\\libs\\mod_spatialite.dll,Linux下的/usr/lib/mod_spatialite.so。 - 该方法适用于所有.NET版本(.NET Framework、.NET Core/.NET 5+)。
内容的提问来源于stack exchange,提问作者Bilal Yousaf
相关产品推荐
相关产品推荐

