C#中SQLite参数化插入字符串被自动转为数值,如何禁用该转换?
解决SQLite驱动自动转换字符串为数值类型的问题
我之前也踩过一模一样的坑!SQLite的ADO.NET驱动默认会根据参数值的内容自动推断存储类型,当你传入纯数字组成的字符串(比如"123")时,它会自作主张把这个值转成double类型插入,哪怕你的字段定义是TEXT类型。要解决这个问题,核心就是强制驱动把参数当作字符串处理,具体可以这么做:
方法一:手动指定参数的DbType为String
别再用AddWithValue了!这个方法的弊端就是类型推断不可控,换成手动创建SQLiteParameter并明确设置DbType.String,就能彻底避免自动转换:
using (SQLiteCommand cmd = ctx.DB.CreateCommand()) { cmd.CommandText = "INSERT INTO tableName(Text1, Text2) VALUES (@text1, @text2)"; // 明确指定参数类型为字符串,拒绝自动推断 cmd.Parameters.Add(new SQLiteParameter("@text1", DbType.String) { Value = "abc" }); cmd.Parameters.Add(new SQLiteParameter("@text2", DbType.String) { Value = "123" }); cmd.ExecuteNonQuery(); }
方法二:批量插入时复用参数(保持类型不变)
如果是批量插入场景,没必要每次都创建新参数,只要初始化时指定好DbType,后续更新值的时候类型会保持为字符串,不会被自动转换:
using (SQLiteCommand cmd = ctx.DB.CreateCommand()) { cmd.CommandText = "INSERT INTO tableName(Text1, Text2) VALUES (@text1, @text2)"; // 提前创建参数并指定类型 var paramText1 = new SQLiteParameter("@text1", DbType.String); var paramText2 = new SQLiteParameter("@text2", DbType.String); cmd.Parameters.Add(paramText1); cmd.Parameters.Add(paramText2); // 遍历批量插入数据 foreach (var dataItem in yourBatchDataList) { paramText1.Value = dataItem.Text1; paramText2.Value = dataItem.Text2; // 哪怕是"456"这类纯数字字符串,也会按TEXT类型插入 cmd.ExecuteNonQuery(); } }
为什么会出现这个问题?
本质是SQLite的弱类型特性加上ADO.NET驱动的默认推断逻辑:当你用AddWithValue传入字符串时,驱动会检查字符串内容,如果是纯数字,就会把它映射为SQLite的REAL(浮点)类型,而不是TEXT类型,最终导致插入TEXT字段时发生自动类型转换。手动指定DbType.String就相当于给驱动下了死命令:不管内容是什么,都按字符串处理!
内容的提问来源于stack exchange,提问作者javaBeCool
相关产品推荐
相关产品推荐

