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

C#使用System.Data.SQLite插入GUID时报unrecognized token错误

问题结论

该错误和SQLite的DATE类型格式规则没有任何关系,核心原因是你拼接INSERT语句时,所有字符串、日期类型的传入值都没有按照SQL语法要求用单引号包裹,解析器会把值中的-识别为算术减法运算符,碰到GUID片段不符合算术表达式规则时直接抛出语法错误。

错误原理

你当前通过字符串插值生成的SQL语句实际格式如下:

insert into completelocalmessages (Date, Sender, Message, Receiver, ID) values(2024-5-20, 1a2b3c4d-5678-90ef-ghij-klmnopqrstuv, 测试内容, wxyz1234-5678-90ab-cdef-ghijklmnopqr, 1)

这种写法下SQL解析逻辑完全不符合预期:

  • 日期部分的2024-5-20会被解析为算术减法表达式,最终计算为整数1999,根本无法存入正确日期
  • GUID值没有引号包裹,解析器读到第一段字符串1a2b3c4d后,碰到后续的-会默认按减法运算处理,后面的GUID片段既不是合法数值也不是合法字段名,解析到第一个-的位置就会抛出语法错误
  • Message字段如果包含空格、单引号等特殊字符,还会触发更多随机语法问题,同时存在SQL注入风险

另外你的建表语句存在隐藏bug:标准带横杠的GUID字符串总长度为36位,你给Sender、Receiver字段设置的Text(30)长度不足,后续即使修复语法错误,存入的GUID也会被截断。

修复方案

优先推荐:使用参数化查询

这是System.Data.SQLite官方推荐的写法,完全不需要手动处理引号、转义、格式匹配问题,从根源避免语法错误和SQL注入风险,示例代码:

using var cmd = new SQLiteCommand(
    "insert into completelocalmessages (Date, Sender, Message, Receiver, ID) values(@Date, @Sender, @Message, @Receiver, @ID)", 
    sqliteConnection);
// 直接传对应类型的参数,驱动会自动处理类型转换和格式适配
cmd.Parameters.AddWithValue("@Date", message.Date.Date);
cmd.Parameters.AddWithValue("@Sender", message.From);
cmd.Parameters.AddWithValue("@Message", message.Message);
cmd.Parameters.AddWithValue("@Receiver", message.To);
cmd.Parameters.AddWithValue("@ID", message.ID);
cmd.ExecuteNonQuery();

对应建表语句建议修正字段长度:

create table completelocalmessages (Date date, Sender Text(36), Message Text(400), Receiver Text(36), ID int)

不推荐:手动拼接SQL(仅做语法参考)

如果坚持使用字符串拼接,必须给所有日期、字符串类型的值两侧添加单引号,同时手动转义值内部的单引号(将单个'替换为两个''):

sqlString = $"insert into completelocalmessages (Date, Sender, Message, Receiver, ID) values('{message.Date:yyyy-MM-dd}', '{message.From}', '{message.Message.Replace("'", "''")}', '{message.To}', {message.ID})";

这种写法维护成本高,漏转义就会出现bug或安全问题,非极端情况不要使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 09:36:25