You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过变量动态指定列名获取SQLite查询结果的值?

动态获取Dapper查询结果的列值

你直接写data1.test肯定行不通——C#是静态类型语言,编译器没法识别你用字符串变量定义的"test"属性名。不过有几种实用方法能实现动态指定列名取值的需求:

方法1:转成字典取值

Dapper的QuerySingle返回的dynamic对象本质是ExpandoObject,可以强制转成IDictionary<string, object>,然后通过列名字符串作为键来取值:

using (IDbConnection cnn = new SQLiteConnection(LoadConnectionString()))
{
    var sql = "select * from " + tablename + " where ID = " + itemid;
    var data1 = cnn.QuerySingle(sql);
    // 把dynamic转成字典
    var dataDict = (IDictionary<string, object>)data1;
    string targetColumn = "Column1";
    // 通过列名取值,记得判空避免空引用
    string s = dataDict[targetColumn]?.ToString();
}

方法2:用反射获取属性值

如果你的查询结果是映射到具体实体类的(不是用dynamic),可以用反射动态取属性值:

// 假设你的实体类是MyTableEntity
using (IDbConnection cnn = new SQLiteConnection(LoadConnectionString()))
{
    var sql = "select * from " + tablename + " where ID = " + itemid;
    var data1 = cnn.QuerySingle<MyTableEntity>(sql);
    string targetColumn = "Column1";
    // 反射找到对应属性
    var prop = typeof(MyTableEntity).GetProperty(targetColumn);
    // 取值并转成字符串,同样注意判空
    string s = prop?.GetValue(data1)?.ToString();
}

重要提醒:别忽略SQL注入风险

你现在直接拼接表名和ID的写法有严重的SQL注入漏洞,一定要改。如果是参数化ID的话可以这么写:

var sql = "select * from " + tablename + " where ID = @ItemId";
var data1 = cnn.QuerySingle(sql, new { ItemId = itemid });

至于表名,SQLite不支持用参数绑定表名,建议提前把允许访问的表名列成白名单,验证tablename在名单内再拼接,彻底避免注入风险。

内容的提问来源于stack exchange,提问作者catalyst6

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 22:52:40