你好!
任务:需要在 C# 应用程序 (WPF .NetFramework 4.8) 中将几何体从空间 SQLite 数据库提取到 Spatialite。为此,我SELECT AsText(geometry)
对数据库记录运行一个命令。
问题出在哪里:为了执行 AsText(),需要通过 LoadExtension() 将 Spatialite 模块连接到 SQLite,我做不到。
尝试通过connection.LoadExtinsion("mod_spatialite")
错误:(System.Data.SQLite.SQLiteException: "SQL logic error Не найден указанный модуль."
虽然模块在应用程序文件夹中,但我也尝试指定它的路径 - 问题并没有消失)
试command.CommandText = "SELECT load_extension(\'mod_spatialite\')";
错:(System.Data.SQLite.SQLiteException: "SQL logic error not authorized"
虽然connection.EnableExtensions(true);
是注册的,而且在sqlite3.exe中,PS里写过,没有报错)
private void test()
{
var connectionStr = new SQLiteConnectionStringBuilder()
{
DataSource = "polygonSpat.sqlite"
}.ToString();
using (var connection = new SQLiteConnection(connectionStr))
{
connection.Open();
var command = connection.CreateCommand();
connection.EnableExtensions(true);
connection.LoadExtension("mod_spatialite.dll");
//command.CommandText = "SELECT load_extension(\'mod_spatialite\')";
//command.ExecuteNonQuery();
command.CommandText = "select AsText(geometry) from kek ";
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
Console.WriteLine(reader[0]);
}
}
}
}
尝试使用 System.Data.SQLite 和 Microsoft.Data.Sqlite。
PS从这里下载spatialite-loadable-modules-5.0.0-win-amd64.7z,它有sqlite3.exe,它可以毫无问题地加载mod_spatialiteSELECT load_extension(\'mod_spatialite\')
并执行AsText()。我还在那里使用了 spatialite_gui,它可以正常工作。
PPS我试着按照这个指令自己组装它,但是 MSYS2 没有更新,没有更新它就不想工作。我还需要在其他 PC 上运行我的应用程序,并且我不想每次都在其他 PC 上构建库,所以这个选项不适合,但是,它可能需要构建一次......反过来,spatial_gui证明一切都应该更容易。
PPPS没有空间标签,这很令人沮丧。[UPD:有标签)]
几天后找到了解决方案(不是我,而是天才)!!
一般来说,您可以在此处阅读更多详细信息。
简而言之,您需要在 PATH 环境变量中为 SQLite 设置包含 Spatialite 模块的目录的路径。
我还将给出一个代码示例,其中仅针对应用程序进程替换 PATH。在示例中,mod_spatialite.dll 位于程序所在的文件夹中,但是,它可以放在任何其他位置(途中没有与 Cyrillic 核对)。
使用了 WPF .NetFramework 4.8 上的 NuGet 包 Microsoft.Data.Sqlite。
PS如果报错:“... is not a win32 application”,则需要进入项目属性->程序集,取消勾选“32-bit version ispreferred”。