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

求助排查SQLiteException: unrecognized token错误

解决SQLite "unrecognized token" 错误问题

你遇到的问题根源在于表名的标识符格式不一致,具体是创建表和插入数据时对表名的处理方式不同导致的。

问题分析

你在CreateTable方法里创建表时,给生成的driftID(也就是表名)加上了双引号:

string sql = "CREATE TABLE " + "\"" + driftID + "\"" + " " + "(\"DriftIndex\" INTEGER PRIMARY KEY AUTOINCREMENT, ...)";

但在PopulateTable的INSERT语句里,直接使用了未加引号的driftID作为表名:

string sql = "INSERT INTO " + driftID + " " + "(DriftID, DriftName, ...) VALUES(?, ?, ?, ?, ?, ?)";

你的driftID是通过Guid.NewGuid().ToString().Replace("-", "")生成的,开头是数字(比如错误信息里的8d51c6b280c64bea848f29e5cad91ee3),SQLite会把这种无引号的、以数字开头的字符串解析为数值,而不是表名标识符,因此抛出了unrecognized token错误。

解决方案

修改PopulateTable方法里的SQL语句,给表名driftID也加上双引号,和创建表时的格式保持一致:

public void PopulateTable() {
    // 给表名加上双引号,与建表时的格式统一
    string sql = "INSERT INTO \"" + driftID + "\" " + 
                 "(DriftID, DriftName, DriftStep, DriftLat, DriftLong, DriftTexLocation) " + 
                 "VALUES(?, ?, ?, ?, ?, ?)";
    dbManager.BeginTransaction();
    while (driftNumSteps > 0) {
        dbManager.Execute(sql, driftID, driftName, GenerateDriftStep(), driftLat, driftLong, driftTexLocation);
        driftNumSteps--;
    }
    dbManager.Commit();
}

额外建议

  • 尽量避免用随机生成的字符串作为表名,这种做法不仅容易出现标识符格式问题,也不利于后续的数据库维护。如果需要存储多条漂移数据,建议创建一个固定名称的表(比如Drifts),用DriftID作为区分不同漂移的字段,而不是每个漂移单独建表。
  • SQLite不支持参数化表名/列名,所以手动拼接标识符时,一定要用双引号包裹,避免解析错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:32:43