解決Sqlite“無(wú)法加載?DLL“e_sqlite3”:?找不到指定的模塊”的方法
今天在使用 NuGet 安裝 System.Data.SQLite 庫(kù)后,發(fā)現(xiàn)運(yùn)行就報(bào)錯(cuò):System.DllNotFoundException:“無(wú)法加載 DLL“e_sqlite3”: 找不到指定的模塊。 (異常來(lái)自 HRESULT:0x8007007E)。”
百度查了半天,啥都沒(méi)有,我也是醉了,問(wèn)AI也沒(méi)問(wèn)出個(gè)答案,回答全是亂七八糟的,于是我又查看了 System.Data.SQLite 的自述文件和包詳細(xì)信息,是這樣:


啥都沒(méi)寫(xiě),這種庫(kù)也是奇葩,我有點(diǎn)好奇能用在商業(yè)項(xiàng)目中么,一點(diǎn)規(guī)范都沒(méi)有,有點(diǎn)像個(gè)人開(kāi)發(fā)者的行為。
我又搜了下 e_sqlite3,不是沒(méi)用就是要錢(qián),what ??
后面我又在 百度 找 System.Data.SQLite 官網(wǎng),找到了這么一個(gè)地址

打開(kāi)一看,剛好找到了答案,界面如下:

這里的描述文字寫(xiě)著:
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 上獲取。典型用法通常需要添加兩個(gè) NuGet 包:一個(gè)用于 System.Data.SQLite,另一個(gè)包含 SQLite 的本機(jī)構(gòu)建(例如 System.Data.SQLite.Core)。例如:
看到這里我算是知道了,還需要安裝另一個(gè)庫(kù):SourceGear.sqlite3
這下就好辦了,于是我就裝了 SourceGear.sqlite3 這個(gè)庫(kù),如下:

SourceGear.sqlite3 這個(gè)庫(kù) 包詳細(xì)信息這里有一段描述
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.
翻譯成中文:
此軟件包包含適用于不同平臺(tái)的原生 SQLite 代碼構(gòu)建版本。這些構(gòu)建版本的基礎(chǔ)名稱(chēng)均為 ??"e_sqlite3"??。軟件包版本號(hào)中的前三位數(shù)字表示構(gòu)建時(shí)所使用的 SQLite 版本,若存在第四位數(shù)字,則會(huì)根據(jù)打包相關(guān)的修改需求進(jìn)行遞增
好吧,我先搭建下 Sqlite 的環(huán)境,讓 Winform 能調(diào)用 Sqlite 進(jìn)行增刪改查,項(xiàng)目我就不上傳了,直接貼一個(gè) SqliteHelper.cs 好了
using System;
using System.Data;
using System.Data.SQLite;
using System.Collections.Generic;
using System.Reflection;
public class SqliteHelper
{
/// <summary>
/// 數(shù)據(jù)庫(kù)連接字符串
/// </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>
/// 執(zhí)行 插入、更新、刪除 操作
/// </summary>
/// <param name="sql">要執(zhí)行的SQL語(yǔ)句(INSERT/UPDATE/DELETE)</param>
/// <param name="parameters">SQL參數(shù)數(shù)組,防止SQL注入</param>
/// <returns>p1.是否成功,p2.錯(cuò)誤信息</returns>
public static (bool, string) ExecuteSql(string sql, params SQLiteParameter[] parameters)
{
if (ConnectionString == null)
return (false, "請(qǐng)先設(shè)置 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 返回受影響的行數(shù)
line = cmd.ExecuteNonQuery();
}
conn.Close();
}
return (true, null);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
return (false, ex.Message);
}
}
/// <summary>
/// 執(zhí)行查詢(xún)SQL
/// </summary>
/// <param name="sql">SQL語(yǔ)句</param>
/// <param name="parameters">SQL參數(shù)數(shù)組,防止SQL注入</param>
/// <returns>p1.是否成功,p2.查詢(xún)的數(shù)據(jù),p3.錯(cuò)誤信息</returns>
public static (bool, DataTable, string) Query(string sql, params SQLiteParameter[] parameters)
{
if (ConnectionString == null)
return (false, null, "請(qǐng)先設(shè)置 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);
//使用數(shù)據(jù)適配器填充 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>
/// 執(zhí)行查詢(xún)SQL
/// </summary>
/// <typeparam name="T">結(jié)果集列表中對(duì)象的類(lèi)型,需提供無(wú)參構(gòu)造函數(shù)</typeparam>
/// <param name="sql">SQL語(yǔ)句</param>
/// <param name="parameters">SQL參數(shù)數(shù)組,防止SQL注入</param>
/// <returns>p1.是否成功,p2.查詢(xún)的數(shù)據(jù),p3.錯(cuò)誤信息</returns>
public static (bool, List<T>, string) Query<T>(string sql, params SQLiteParameter[] parameters) where T : new()
{
if (ConnectionString == null)
return (false, null, "請(qǐng)先設(shè)置 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())
{
// 獲取一次性獲取列的元數(shù)據(jù),用于反射匹配屬性
var schemaTable = reader.GetSchemaTable();
// 建立列名到序號(hào)的映射
var ordinals = new Dictionary<string, int>();
foreach (DataRow col in schemaTable.Rows)
{
string colName = col["ColumnName"].ToString();
ordinals[colName] = (int)col["ColumnOrdinal"];
}
// 獲取泛型類(lèi)型的所有可寫(xiě)屬性
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)
{
// 轉(zhuǎn)換為屬性的實(shí)際類(lèi)型后賦值
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);
}
}
}
運(yùn)行項(xiàng)目,你會(huì)發(fā)現(xiàn)項(xiàng)目依然報(bào)錯(cuò):

翻譯成中文:此軟件包不支持 Any CPU 版本
也就是說(shuō),生成的時(shí)候,不能使用 Any CPU
點(diǎn)擊項(xiàng)目的 配置管理器

在 “活動(dòng)解決方案平臺(tái)” 這里展開(kāi)下拉框,點(diǎn)擊新建

選擇一個(gè)平臺(tái),復(fù)制設(shè)置我選擇空(最好不要和我圖片一樣,我這里是測(cè)試項(xiàng)目),然后點(diǎn)擊確定。關(guān)閉這個(gè)窗體。

然后在 運(yùn)行這里就能看到 x64 的選項(xiàng)了

選擇 x64,現(xiàn)在 Sqite 能正常的運(yùn)行了
如果你不想使用 x64 ,想刪除這個(gè)選項(xiàng),也很簡(jiǎn)單,同樣是點(diǎn)擊配置管理器
找到活動(dòng)解決方案平臺(tái)

點(diǎn)擊編輯

然后選中 x64,然后點(diǎn)擊移除就行了
end
到此這篇關(guān)于解決Sqlite“無(wú)法加載 DLL“e_sqlite3”: 找不到指定的模塊”的文章就介紹到這了,更多相關(guān)Sqlite 無(wú)法加載 DLL“e_sqlite3”: 找不到指定的模塊內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在SQLite中進(jìn)行批量操作的有效實(shí)現(xiàn)方法
SQLite是一個(gè)輕量級(jí)的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),因其高效性和易用性而廣受歡迎,在許多應(yīng)用場(chǎng)景中,批量操作的需求是不可避免的,使用SQLite進(jìn)行批量操作,可以顯著提高效率并減少數(shù)據(jù)庫(kù)事務(wù)的開(kāi)銷(xiāo),本文將深入探討在SQLite中進(jìn)行批量操作的有效方法,需要的朋友可以參考下2025-07-07
sqlite循環(huán)批量插入數(shù)據(jù)采用批處理文件實(shí)現(xiàn)
需要在sqlite數(shù)據(jù)庫(kù)中插入大量測(cè)試數(shù)據(jù),需要通過(guò)一個(gè)批處理文件來(lái)循環(huán)調(diào)用插入sqlite語(yǔ)句,感興趣的朋友可以參考下哈,希望可以幫助到你2013-04-04
SQLite3 在嵌入式C環(huán)境中存儲(chǔ)音頻/視頻文件的最優(yōu)方案
本文探討了SQLite3在嵌入式C環(huán)境中存儲(chǔ)音視頻文件的優(yōu)化方案,推薦采用文件路徑存儲(chǔ)結(jié)合元數(shù)據(jù)管理,兼顧效率與資源限制,小文件可使用BLOB存儲(chǔ),輔以壓縮和故障安全機(jī)制,適合資源受限的嵌入式系統(tǒng),對(duì)SQLite3存儲(chǔ)文件相關(guān)知識(shí)感興趣的朋友一起看看吧2025-06-06
嵌入式數(shù)據(jù)庫(kù)SQLite?3配置使用講解
本文強(qiáng)調(diào)嵌入式項(xiàng)目中SQLite3數(shù)據(jù)庫(kù)的重要性,因其零配置、輕量級(jí)、跨平臺(tái)及事務(wù)處理特性,可保障數(shù)據(jù)溯源與責(zé)任明確,詳細(xì)講解安裝配置、基礎(chǔ)語(yǔ)法及SQLiteStudio工具使用,提升數(shù)據(jù)管理效率,感興趣的朋友跟隨小編一起看看吧2025-06-06
SQLite教程(十三):C語(yǔ)言編程實(shí)例代碼(1)
這篇文章主要介紹了SQLite教程(十三):C語(yǔ)言編程實(shí)例代碼(1),本文講解了獲取表的Schema信息、動(dòng)態(tài)創(chuàng)建表、刪除該表、常規(guī)數(shù)據(jù)插入、創(chuàng)建測(cè)試數(shù)據(jù)表、刪除測(cè)試表等內(nèi)容,需要的朋友可以參考下2015-05-05

