解决Sqlite“无法加载 DLL“e_sqlite3”: 找不到指定的模块”的方法

 更新时间:2025年11月07日 09:34:02   作者:熊思宇  
这篇文章主要介绍了Sqlite“无法加载 DLL“e_sqlite3”: 找不到指定的模块”的解决方法,文中通过代码介绍的非常详细,对大家学习或者使用sqlite具有一定的参考借鉴价值,需要的朋友可以参考下

今天在使用 NuGet 安装 System.Data.SQLite 库后,发现运行就报错:System.DllNotFoundException:“无法加载 DLL“e_sqlite3”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)。”

百度查了半天,啥都没有,我也是醉了,问AI也没问出个答案,回答全是乱七八糟的,于是我又查看了 System.Data.SQLite 的自述文件和包详细信息,是这样:

啥都没写,这种库也是奇葩,我有点好奇能用在商业项目中么,一点规范都没有,有点像个人开发者的行为。

我又搜了下 e_sqlite3,不是没用就是要钱,what ??

后面我又在 百度 找 System.Data.SQLite 官网,找到了这么一个地址

打开一看,刚好找到了答案,界面如下:

这里的描述文字写着:

System.Data.SQLite is available on nuget.org. Typical usage would involve adding two packages, one for System.Data.SQLite, and one containing a native built of SQLite. For example:

翻译成中文:

System.Data.SQLite 可在 nuget.org 上获取。典型用法通常需要添加两个 NuGet 包:一个用于 System.Data.SQLite,另一个包含 SQLite 的本机构建(例如 System.Data.SQLite.Core)。例如:

看到这里我算是知道了,还需要安装另一个库:SourceGear.sqlite3

这下就好办了,于是我就装了 SourceGear.sqlite3 这个库,如下:

SourceGear.sqlite3 这个库 包详细信息这里有一段描述

This package contains builds of the native SQLite code for various platforms.  
    These builds have "e_sqlite3" as the base name.  The first three numbers in the version number of this package indicate the version of SQLite that was used to build it.  The fourth number, if there is one, is incremented as needed for packaging-specific changes.

翻译成中文:

此软件包包含适用于不同平台的原生 SQLite 代码构建版本。这些构建版本的基础名称均为 ​​"e_sqlite3"​​。软件包版本号中的前三位数字表示构建时所使用的 SQLite 版本,若存在第四位数字,则会根据打包相关的修改需求进行递增

好吧,我先搭建下 Sqlite 的环境,让 Winform 能调用 Sqlite 进行增删改查,项目我就不上传了,直接贴一个 SqliteHelper.cs 好了

using System;
using System.Data;
using System.Data.SQLite;
using System.Collections.Generic;
using System.Reflection;

public class SqliteHelper
{
    /// <summary>
    /// 数据库连接字符串
    /// </summary>
    public static string ConnectionString { get; set; } = "Data Source=work.db;Version=3;Pooling=True;Journal Mode=WAL;Cache=Shared;Synchronous=NORMAL;BusyTimeout=5000;";

    /// <summary>
    /// 执行 插入、更新、删除 操作
    /// </summary>
    /// <param name="sql">要执行的SQL语句(INSERT/UPDATE/DELETE)</param>
    /// <param name="parameters">SQL参数数组,防止SQL注入</param>
    /// <returns>p1.是否成功,p2.错误信息</returns>
    public static (bool, string) ExecuteSql(string sql, params SQLiteParameter[] parameters)
    {
        if (ConnectionString == null)
            return (false, "请先设置 ConnectionString");

        try
        {
            int line = 0;
            using (var conn = new SQLiteConnection(ConnectionString))
            {
                conn.Open();
                using (var cmd = new SQLiteCommand(sql, conn))
                {
                    if (parameters != null && parameters.Length > 0)
                        cmd.Parameters.AddRange(parameters);
                    // ExecuteNonQuery 返回受影响的行数
                    line = cmd.ExecuteNonQuery();
                }
                conn.Close();
            }
            return (true, null);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.ToString());
            return (false, ex.Message);
        }
    }

    /// <summary>
    /// 执行查询SQL
    /// </summary>
    /// <param name="sql">SQL语句</param>
    /// <param name="parameters">SQL参数数组,防止SQL注入</param>
    /// <returns>p1.是否成功,p2.查询的数据,p3.错误信息</returns>
    public static (bool, DataTable, string) Query(string sql, params SQLiteParameter[] parameters)
    {
        if (ConnectionString == null)
            return (false, null, "请先设置 ConnectionString");

        try
        {
            var dataTable = new DataTable();
            using (var conn = new SQLiteConnection(ConnectionString))
            {
                conn.Open();
                using (var cmd = new SQLiteCommand(sql, conn))
                {
                    if (parameters != null && parameters.Length > 0)
                        cmd.Parameters.AddRange(parameters);
                    //使用数据适配器填充 DataTable
                    using (var adapter = new SQLiteDataAdapter(cmd))
                        adapter.Fill(dataTable);
                }
                conn.Close();
            }
            return (true, dataTable, null);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.ToString());
            return (false, null, ex.Message);
        }
    }

    /// <summary>
    /// 执行查询SQL
    /// </summary>
    /// <typeparam name="T">结果集列表中对象的类型,需提供无参构造函数</typeparam>
    /// <param name="sql">SQL语句</param>
    /// <param name="parameters">SQL参数数组,防止SQL注入</param>
    /// <returns>p1.是否成功,p2.查询的数据,p3.错误信息</returns>
    public static (bool, List<T>, string) Query<T>(string sql, params SQLiteParameter[] parameters) where T : new()
    {
        if (ConnectionString == null)
            return (false, null, "请先设置 ConnectionString");

        List<T> list = new List<T>();
        try
        {
            using (var conn = new SQLiteConnection(ConnectionString))
            {
                conn.Open();
                using (var cmd = new SQLiteCommand(sql, conn))
                {
                    if (parameters != null && parameters.Length > 0)
                        cmd.Parameters.AddRange(parameters);
                    
                    using (var reader = cmd.ExecuteReader())
                    {
                        // 获取一次性获取列的元数据,用于反射匹配属性
                        var schemaTable = reader.GetSchemaTable();
                        // 建立列名到序号的映射
                        var ordinals = new Dictionary<string, int>();
                        foreach (DataRow col in schemaTable.Rows)
                        {
                            string colName = col["ColumnName"].ToString();
                            ordinals[colName] = (int)col["ColumnOrdinal"];
                        }
                        // 获取泛型类型的所有可写属性
                        Type objType = typeof(T);
                        PropertyInfo[] properties = objType.GetProperties();
                        while (reader.Read())
                        {
                            T obj = new T();
                            foreach (PropertyInfo prop in properties)
                            {
                                if (!prop.CanWrite) continue;
                                if (ordinals.ContainsKey(prop.Name))
                                {
                                    object value = reader.GetValue(ordinals[prop.Name]);
                                    if (value != DBNull.Value)
                                    {
                                        // 转换为属性的实际类型后赋值
                                        Type targetType = Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType;
                                        object safeValue = Convert.ChangeType(value, targetType);
                                        prop.SetValue(obj, safeValue);
                                    }
                                }
                            }
                            list.Add(obj);
                        }
                        reader.Close();
                    }
                }
                conn.Close();
            }
            return (true, list, null);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.ToString());
            return (false, null, ex.Message);
        }
    }
}

运行项目,你会发现项目依然报错:

翻译成中文:此软件包不支持 Any CPU 版本

也就是说,生成的时候,不能使用 Any CPU

点击项目的 配置管理器

在 “活动解决方案平台” 这里展开下拉框,点击新建

选择一个平台,复制设置我选择空(最好不要和我图片一样,我这里是测试项目),然后点击确定。关闭这个窗体。

然后在 运行这里就能看到 x64 的选项了

选择 x64,现在 Sqite 能正常的运行了

如果你不想使用 x64 ,想删除这个选项,也很简单,同样是点击配置管理器

找到活动解决方案平台

点击编辑

然后选中 x64,然后点击移除就行了

end

到此这篇关于解决Sqlite“无法加载 DLL“e_sqlite3”: 找不到指定的模块”的文章就介绍到这了,更多相关Sqlite 无法加载 DLL“e_sqlite3”: 找不到指定的模块内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 在SQLite中进行批量操作的有效实现方法

    在SQLite中进行批量操作的有效实现方法

    SQLite是一个轻量级的关系型数据库管理系统,因其高效性和易用性而广受欢迎,在许多应用场景中,批量操作的需求是不可避免的,使用SQLite进行批量操作,可以显著提高效率并减少数据库事务的开销,本文将深入探讨在SQLite中进行批量操作的有效方法,需要的朋友可以参考下
    2025-07-07
  • ubuntu下使用SQLite3的基本命令

    ubuntu下使用SQLite3的基本命令

    sqlite3一款主要用于嵌入式的轻量级数据库,本文旨在为熟悉sqlite3基本命令提供技术文档。希望对读者们有所帮助,如有疑问请和我联系,尽可能解答
    2014-08-08
  • sqlite循环批量插入数据采用批处理文件实现

    sqlite循环批量插入数据采用批处理文件实现

    需要在sqlite数据库中插入大量测试数据,需要通过一个批处理文件来循环调用插入sqlite语句,感兴趣的朋友可以参考下哈,希望可以帮助到你
    2013-04-04
  • SQLite3 在嵌入式C环境中存储音频/视频文件的最优方案

    SQLite3 在嵌入式C环境中存储音频/视频文件的最优方案

    本文探讨了SQLite3在嵌入式C环境中存储音视频文件的优化方案,推荐采用文件路径存储结合元数据管理,兼顾效率与资源限制,小文件可使用BLOB存储,辅以压缩和故障安全机制,适合资源受限的嵌入式系统,对SQLite3存储文件相关知识感兴趣的朋友一起看看吧
    2025-06-06
  • SQLite3基本介绍与常用语句汇总(最新整理)

    SQLite3基本介绍与常用语句汇总(最新整理)

    SQLite3是一款轻量级嵌入式数据库,无需服务器,单文件存储,支持标准SQL与ACID事务,适用于移动应用、嵌入式系统及快速开发场景,具备跨平台、易部署、高效管理的特点,本文给大家介绍SQLite3介绍与常用语句汇总,感兴趣的朋友一起看看吧
    2025-06-06
  • SQLite教程(四):内置函数

    SQLite教程(四):内置函数

    这篇文章主要介绍了SQLite教程(四):内置函数,本文讲解了聚合函数、核心函数、日期和时间函数、,需要的朋友可以参考下
    2015-05-05
  • 嵌入式数据库SQLite 3配置使用讲解

    嵌入式数据库SQLite 3配置使用讲解

    本文强调嵌入式项目中SQLite3数据库的重要性,因其零配置、轻量级、跨平台及事务处理特性,可保障数据溯源与责任明确,详细讲解安装配置、基础语法及SQLiteStudio工具使用,提升数据管理效率,感兴趣的朋友跟随小编一起看看吧
    2025-06-06
  • SQLite3命令行工具最佳实践指南

    SQLite3命令行工具最佳实践指南

    SQLite3是轻量级嵌入式数据库,无需服务器支持,具备ACID事务与跨平台特性,适用于小型项目和学习,sqlite3.exe作为命令行工具,支持SQL执行、数据库管理、数据导入导出及备份恢复,提供高效的数据库操作方式,本文给大家介绍SQLite3命令行工具实践指南,感兴趣的朋友一起看看吧
    2025-06-06
  • Sqlite3基本语句及安装过程

    Sqlite3基本语句及安装过程

    SQLite3是轻量级嵌入式数据库,零配置无需服务器,数据存储于.db文件,支持基本SQL操作如创建表、查询、更新、删除,及where条件筛选,Ubuntu下可通过命令安装,常用指令包括.help、.tables等,本文给大家介绍Sqlite3基本语句,感兴趣的朋友一起看看吧
    2025-06-06
  • SQLite教程(十三):C语言编程实例代码(1)

    SQLite教程(十三):C语言编程实例代码(1)

    这篇文章主要介绍了SQLite教程(十三):C语言编程实例代码(1),本文讲解了获取表的Schema信息、动态创建表、删除该表、常规数据插入、创建测试数据表、删除测试表等内容,需要的朋友可以参考下
    2015-05-05

最新评论