如何在PowerShell中正确使用Dapper查询SQLite数据库?
在PowerShell中正确使用Dapper查询SQLite数据库
问题根源
- Dapper的Query是扩展方法:它并非
SQLiteConnection类的原生实例方法,而是Dapper.SqlMapper类提供的静态扩展方法,因此用Get-Member查看$con不会显示Query方法。 - PowerShell泛型方法调用语法差异:PowerShell不支持C#风格的
Method[Type]()泛型调用方式,需使用PowerShell特有的语法指定泛型参数。
正确实现代码
# 加载必要的程序集 Add-Type -Path "C:\test\database\System.Data.SQLite.dll" Add-Type -Path "C:\test\database\Dapper.dll" # 创建并打开数据库连接 $con = [System.Data.SQLite.SQLiteConnection]::new("Data Source=C:\test\database\database.db") $con.Open() try { $sql = "select * from keypad where id = 1" # 直接调用Dapper.SqlMapper的静态Query方法,指定泛型参数为dynamic $results = [Dapper.SqlMapper]::Query([dynamic], $con, $sql) # 获取第一条结果 $res = $results | Select-Object -First 1 # 输出结果 $res } finally { # 确保连接关闭与资源释放 $con.Close() $con.Dispose() }
关键说明
- 优先调用静态方法:PowerShell对.NET扩展方法的支持不够直观,直接调用
[Dapper.SqlMapper]::Query静态方法更可靠。第一个参数为泛型类型(此处用[dynamic]),第二个参数是数据库连接实例,后续可传入SQL语句、参数等。 - 泛型参数指定规则:PowerShell中调用泛型静态方法时,需将泛型类型作为第一个参数传入,这是PowerShell的语法要求。
- 资源安全处理:用
try/finally块确保数据库连接被正确关闭和释放,避免资源泄漏。
替代方案:使用强类型映射(可选)
若不需要dynamic,可定义对应数据表的类来映射结果:
# 定义与keypad表结构匹配的类 class Keypad { [int]$id # 根据你的表结构添加其他属性,例如[string]$keyName } # 调用时指定泛型为Keypad类型 $results = [Dapper.SqlMapper]::Query([Keypad], $con, $sql) $res = $results | Select-Object -First 1
内容的提问来源于stack exchange,提问作者wolfde
相关产品推荐
相关产品推荐

