解决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”: 找不到指定的模块内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SQLite3 安装、基本操作使用示例

    SQLite3 安装、基本操作使用示例

    本文介绍了SQLite3的安装方法(含可选工具包和图形界面)及基本操作,包括数据库创建、表结构定义、数据增删改查和删除数据库文件的技巧,同时概述了其轻量、嵌入式、跨平台、ACID事务等核心特性,感兴趣的朋友跟随小编一起看看吧
    2025-06-06
  • SQLite数据库安装及基本操作指南

    SQLite数据库安装及基本操作指南

    SQLite 是一个开源的嵌入式关系数据库,实现自包容、零配置、支持事务的SQL数据库引擎。 其特点是高度便携、使用方便、结构紧凑、高效、可靠。今天我们主要来讲解下SQLite数据库的安装以及基本操作指南
    2014-08-08
  • sqlite时间戳转时间语句(时间转时间戳)

    sqlite时间戳转时间语句(时间转时间戳)

    这篇文章主要介绍了sqlite时间戳转时间、时间转时间戳的方法,需要的朋友可以参考下
    2014-06-06
  • SQLite高手晋级教程:调试与性能优化以及常见问题

    SQLite高手晋级教程:调试与性能优化以及常见问题

    SQLite 是一个轻量级的数据库,广泛用于各种应用中,包括移动应用和嵌入式系统,尽管它非常灵活和强大,但在处理大规模数据或高并发请求时,性能优化变得非常重要,本篇文章将重点讲解 SQLite 的调试工具和性能优化技巧,以帮助您解决常见问题并进一步提升数据库性能
    2025-03-03
  • 保护你的Sqlite数据库(SQLite数据库安全秘籍)

    保护你的Sqlite数据库(SQLite数据库安全秘籍)

    相信使用PHP开发的人员一定不会对SQLite感到陌生了,PHP5已经集成了这个轻量型的数据库。并且很多虚拟主机无论是win还是*nux都支持它。
    2011-08-08
  • VScode第三方插件打开sqlite数据库图文教程

    VScode第三方插件打开sqlite数据库图文教程

    在实际做一个项目的时候,为了提高效率我们会首选不重复造轮子,所以可能会用到第三方库,下面这篇文章主要给大家介绍了关于VScode第三方插件打开sqlite数据库的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-06-06
  • SQLite教程(十三):C语言编程实例代码(1)

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

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

    SQLite教程(二):C/C++接口简介

    这篇文章主要介绍了SQLite教程(二):C/C++接口简介,本文讲解了C/C++接口概述、核心对象和接口、参数绑定等内容,需要的朋友可以参考下
    2015-05-05
  • sqlite3 命令行工具使用指南

    sqlite3 命令行工具使用指南

    本文系统介绍sqlite3 CLI的启动、数据库操作、元数据查询、数据导入导出及输出格式化命令,涵盖文件管理、备份恢复、性能统计等实用功能,并说明命令分类、SQL语法和资源限制,助力高效数据库管理,对sqlite3 命令行工具相关知识感兴趣的朋友一起看看吧
    2025-06-06
  • SQLite教程(十四):C语言编程实例代码(2)

    SQLite教程(十四):C语言编程实例代码(2)

    这篇文章主要介绍了SQLite教程(十四):C语言编程实例代码(2),本文讲解了高效的批量数据插入和数据查询代码实例,需要的朋友可以参考下
    2015-05-05

最新评论