如何通过变量动态指定列名获取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
相关产品推荐
相关产品推荐

