如何在PowerShell环境中使用嵌入式C#代码查询SQLite数据库?
在PowerShell中嵌入C#代码执行SQLite查询
步骤1:准备SQLite .NET驱动
首先需要获取SQLite的.NET驱动,推荐使用Microsoft.Data.Sqlite(官方维护,兼容.NET Core/.NET 5+,PowerShell 7+支持良好);如果是PowerShell 5.1,可选用System.Data.SQLite。
- 对于PowerShell 7+,通过NuGet安装驱动:
Install-Package Microsoft.Data.Sqlite -Scope CurrentUser
安装完成后,找到对应程序集路径(通常在$HOME\.nuget\packages\microsoft.data.sqlite\[版本号]\lib\net6.0\Microsoft.Data.Sqlite.dll),后续加载时使用。
步骤2:嵌入C#代码封装查询逻辑
使用Add-Type命令将C#代码嵌入PowerShell,封装SQLite查询的核心逻辑,完整示例如下:
# 加载SQLite程序集(替换为你的实际路径) $sqliteDllPath = "$HOME\.nuget\packages\microsoft.data.sqlite\7.0.11\lib\net6.0\Microsoft.Data.Sqlite.dll" Add-Type -Path $sqliteDllPath # 嵌入C#代码,实现查询方法 Add-Type @" using Microsoft.Data.Sqlite; using System.Collections.Generic; public class SqliteQueryHelper { public static List<Dictionary<string, object>> ExecuteQuery(string connectionString, string query, params SqliteParameter[] parameters) { var results = new List<Dictionary<string, object>>(); using (var connection = new SqliteConnection(connectionString)) { connection.Open(); using (var command = new SqliteCommand(query, connection)) { if (parameters != null) { command.Parameters.AddRange(parameters); } using (var reader = command.ExecuteReader()) { while (reader.Read()) { var row = new Dictionary<string, object>(); for (int i = 0; i < reader.FieldCount; i++) { row.Add(reader.GetName(i), reader.IsDBNull(i) ? null : reader.GetValue(i)); } results.Add(row); } } } } return results; } } "@ # 实际调用示例:查询SQLite数据库 $dbPath = "C:\path\to\your\database.db" $connectionString = $"Data Source={$dbPath};" # 参数化查询(避免SQL注入) $query = "SELECT Id, Name, Age FROM Users WHERE Age > @MinAge" $parameters = @( New-Object Microsoft.Data.Sqlite.SqliteParameter("@MinAge", 18) ) # 执行查询并输出结果 $results = [SqliteQueryHelper]::ExecuteQuery($connectionString, $query, $parameters) foreach ($row in $results) { Write-Host "ID: $($row['Id']), Name: $($row['Name']), Age: $($row['Age'])" }
关键细节说明
- 参数化查询:必须用
SqliteParameter传递参数,禁止直接拼接SQL字符串,防止SQL注入。 - 资源自动释放:C#代码中用
using语句处理数据库连接、命令和阅读器,避免内存泄漏。 - 结果格式:返回
List<Dictionary<string, object>>结构,每个字典对应一行数据,键为列名,值为字段值,方便PowerShell遍历处理。
PowerShell 5.1适配调整
如果使用PowerShell 5.1,建议切换到System.Data.SQLite驱动,代码调整如下:
# 加载System.Data.SQLite程序集(可通过Chocolatey安装:choco install sqlite.shell) Add-Type -Path "C:\Program Files\SQLite\System.Data.SQLite.dll" # 替换嵌入的C#代码命名空间 Add-Type @" using System.Data.SQLite; using System.Collections.Generic; public class SqliteQueryHelper { public static List<Dictionary<string, object>> ExecuteQuery(string connectionString, string query, params SQLiteParameter[] parameters) { var results = new List<Dictionary<string, object>>(); using (var connection = new SQLiteConnection(connectionString)) { connection.Open(); using (var command = new SQLiteCommand(query, connection)) { if (parameters != null) { command.Parameters.AddRange(parameters); } using (var reader = command.ExecuteReader()) { while (reader.Read()) { var row = new Dictionary<string, object>(); for (int i = 0; i < reader.FieldCount; i++) { row.Add(reader.GetName(i), reader.IsDBNull(i) ? null : reader.GetValue(i)); } results.Add(row); } } } } return results; } } "@
内容的提问来源于stack exchange,提问作者Carsten
相关产品推荐
相关产品推荐

