使用Dapper操作SQLite时,带短横线列名的参数匹配问题咨询
在Dapper与SQLite中使用带短横线的列名匹配同名参数
要实现带短横线的列名与同名参数匹配,核心是正确处理SQLite的参数语法和Dapper的参数映射规则,具体方案如下:
关键写法说明
SQLite允许参数名包含特殊字符(如短横线),但需要用双引号包裹参数名的标识符部分;同时Dapper会自动忽略参数名前的@符号,直接使用后续的标识符匹配参数集合中的键。
具体实现代码
静态场景示例
public void Insert(int id, string somefield) { using(var db = new SQLiteConnection("你的SQLite连接字符串")) { // SQL中参数用@"列名"的形式 string sql = "INSERT INTO Example (id, [some-field]) VALUES (@id, @\"some-field\")"; // 参数字典直接使用原始列名作为键 var parameters = new Dictionary<string, object> { {"id", id}, {"some-field", somefield} }; db.Execute(sql, parameters); } }
动态生成SQL场景示例
如果列名是动态计算的,可以通过字符串拼接生成符合要求的SQL语句:
public void Insert(Dictionary<string, object> columnValues) { using(var db = new SQLiteConnection("你的SQLite连接字符串")) { // 生成列名部分(用方括号包裹特殊列名) var columns = string.Join(", ", columnValues.Keys.Select(col => $"[{col}]")); // 生成参数部分(用@"列名"的形式) var parameters = string.Join(", ", columnValues.Keys.Select(col => $"@\"{col}\"")); string sql = $"INSERT INTO Example ({columns}) VALUES ({parameters})"; // 直接传入列名字典即可匹配 db.Execute(sql, columnValues); } }
错误写法分析
你之前尝试的几种写法失败原因如下:
[@some-field]:SQLite将其解析为名为@some-field的数据库列,而非参数,因此报“不存在列”的错误。@[some-field]:SQLite语法不允许@后直接跟方括号,属于语法错误。"@some-field":这是字符串字面量,会直接插入文本@some-field而非传入的参数值。
内容的提问来源于stack exchange,提问作者Ahmad
相关产品推荐
相关产品推荐

