当前位置: 首页 > news >正文

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

今天在使用 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 (line > 0, 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);//使用数据适配器填充 DataTableusing (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

点击项目的 配置管理器

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

选择一个平台,复制设置我选择空(Any CPU 这项没测试过),然后点击确定。关闭这个窗体。

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

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

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

找到活动解决方案平台

点击编辑

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

end


文章转载自:

http://kO4oFsHF.Lhgqc.cn
http://kUBVb29N.Lhgqc.cn
http://5fYykK66.Lhgqc.cn
http://bFgAnCPs.Lhgqc.cn
http://5U1EIQ5Z.Lhgqc.cn
http://fiemStg3.Lhgqc.cn
http://NbMDnr8K.Lhgqc.cn
http://1dSequLL.Lhgqc.cn
http://LGnfpwMx.Lhgqc.cn
http://5LCXzZUc.Lhgqc.cn
http://iWXwvQsF.Lhgqc.cn
http://88ggALbv.Lhgqc.cn
http://zVnvkNEo.Lhgqc.cn
http://5bq396HX.Lhgqc.cn
http://j2h5VTOv.Lhgqc.cn
http://96tE1BC3.Lhgqc.cn
http://XWunZP6l.Lhgqc.cn
http://WLlFTf2i.Lhgqc.cn
http://PpqsXnat.Lhgqc.cn
http://7ClB2hF1.Lhgqc.cn
http://Wk2MYkat.Lhgqc.cn
http://mgHaphhr.Lhgqc.cn
http://96jaCzwX.Lhgqc.cn
http://o3HBssQz.Lhgqc.cn
http://r4LrWG1x.Lhgqc.cn
http://jog5iJbR.Lhgqc.cn
http://8LSjshMh.Lhgqc.cn
http://64Ass8hi.Lhgqc.cn
http://taxFOo7B.Lhgqc.cn
http://L05SLSoA.Lhgqc.cn
http://www.dtcms.com/a/378567.html

相关文章:

  • 项目 PPT 卡壳?模型效果 + 训练数据展示模块直接填 ,451ppt.vip预制PPT也香
  • react-native项目通过华为OBS预签名url实现前端直传
  • Linux-> UDP 编程1
  • Pytest+requests进行接口自动化测试2.0(yaml)
  • 【容器使用】如何使用 docker 和 tar 命令来操作容器镜像
  • 科普:在Windows个人电脑上使用Docker的极简指南
  • 【面试场景题】电商订单系统分库分表方案设计
  • 微服务保护全攻略:从雪崩到 Sentinel 实战
  • springcloud二-Sentinel
  • Redis 持久化与高可用实践(RDB / AOF / Sentinel / Cluster 全解析)
  • Semaphore 信号量深度解析
  • 门店网络重构:告别“打补丁”,用“云网融合”重塑数字竞争力!
  • Linux操作系统之Ubuntu
  • WSL自定义安装多个相同版本的Ubuntu子系统
  • 晶振在5G时代的角色:高精度时钟的核心支撑
  • 【JavaEE】(25) Spring 原理
  • 【科研绘图系列】R语言绘制模型预测与数据可视化
  • 音频中的PDM、PCM概念解读
  • 离线应用开发:Service Worker 与缓存
  • 1、RocketMQ概念详解
  • ZooKeeper Multi-op+乐观锁实战优化:提升分布式Worker节点状态一致性
  • 使用yolo算法对视频进行实时目标跟踪和分割
  • Tomcat日志乱码了怎么处理?
  • 新手该选哪款软件?3ds Max vs Blender深度对比
  • 剧本杀小程序系统开发:构建线上线下融合的剧本杀生态圈
  • 常用加密算法之 AES 简介及应用
  • 【SQL注入系列】JSON注入
  • 盲盒抽卡机小程序:从0到1的蜕变之路
  • 设计模式(C++)详解—工厂方法模式(1)
  • 【Proteus仿真】【51单片机】教室灯光控制器设计