Нужна помощь в отслеживании SQLiteException: нераспознанный токен

Я новичок в работе с SQLite. Я работал над этим большую часть сегодняшнего дня, и у меня возникли проблемы с отслеживанием того, что у меня не так. Ошибка возникает в строке dbManager.Execute(sql, driftID, driftName, GenerateDriftStep(), driftLat, driftLong, driftTexLocation);, но я не уверен, почему. Я дважды проверил, правильно ли указано имя таблицы, и это так. Кто-нибудь может увидеть, где прячется нераспознанный токен? Спасибо!

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using SimpleSQL;
using System;

public class CreateNewDrift : MonoBehaviour
{
    // reference to the database manager in the scene
    public SimpleSQLManager dbManager;

    // reference to the output text in the scene
    public Text outputText;

    // Drift Variables
    public int driftNumSteps;
    private string driftID;
    private string driftName = "temp";
    private float driftLat = 0.0f;
    private float driftLong = 0.0f;
    private string driftTexLocation = "temp";

    string GenerateDriftID()
    {
        driftID = Guid.NewGuid().ToString().Replace("-", "");
        return null;
    }

    string GenerateDriftStep()
    {
        string driftStepInput = GetComponent<DriftInstruction>().ConstructStep();
        return driftStepInput;
    }

    public void CreateTable()
    {
        GenerateDriftID();

        string sql =
            "CREATE TABLE " + "\"" + driftID + "\"" + " " +
            "(\"DriftIndex\" INTEGER PRIMARY KEY AUTOINCREMENT, " +
            "\"DriftID\" VARCHAR(60), " +
            "\"DriftName\" VARCHAR(60), " +
            "\"DriftStep\" TEXT, " +
            "\"DriftLat\" FLOAT, " +
            "\"DriftLong\" FLOAT, " +
            "\"DriftTexLocation\" VARCHAR(255))";
        dbManager.Execute(sql);

        PopulateTable();
    }

    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();
    }
}

Ошибка полностью:

SQLiteException: unrecognized token: "8d51c6b280c64bea848f29e5cad91ee3"
SimpleSQL.SQLite3.Prepare2 (IntPtr db, System.String query)
SimpleSQL.SQLiteCommand.Prepare ()
SimpleSQL.SQLiteCommand.ExecuteNonQuery ()
SimpleSQL.SQLiteConnection.Execute (System.String query, System.Object[] args)
SimpleSQL.SimpleSQLManager.Execute (System.String query, System.Object[] args)
CreateNewDrift.PopulateTable () (at Assets/_Scripts/CreateNewDrift.cs:65)
CreateNewDrift.CreateTable () (at Assets/_Scripts/CreateNewDrift.cs:51)
UnityEngine.Events.InvokableCall.Invoke () (at /Users/builduser/buildslave/unity/build/Runtime/Export/UnityEvent.cs:165)
UnityEngine.Events.UnityEvent.Invoke () (at /Users/builduser/buildslave/unity/build/Runtime/Export/UnityEvent_0.cs:58)
UnityEngine.UI.Button.Press () (at /Users/builduser/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/Button.cs:36)
UnityEngine.UI.Button.OnPointerClick (UnityEngine.EventSystems.PointerEventData eventData) (at /Users/builduser/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/Button.cs:45)
UnityEngine.EventSystems.ExecuteEvents.Execute (IPointerClickHandler handler, UnityEngine.EventSystems.BaseEventData eventData) (at /Users/builduser/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/EventSystem/ExecuteEvents.cs:50)
UnityEngine.EventSystems.ExecuteEvents.Execute[IPointerClickHandler] (UnityEngine.GameObject target, UnityEngine.EventSystems.BaseEventData eventData, UnityEngine.EventSystems.EventFunction`1 functor) (at /Users/builduser/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/EventSystem/ExecuteEvents.cs:261)
UnityEngine.EventSystems.EventSystem:Update()

Можете ли вы записать sql в журнал перед выполнением sql. Я предполагаю, что это будет имя таблицы, которое не может (если не заключено) начинаться с числа (однако похоже, что вы его заключили). Заключение в [], "", "или" в соответствии с Ключевые слова SQLite решило бы эту проблему.

MikeT 28.05.2018 05:11

Скажем так, без включения, приведет к той же ошибке в Navicat, что и СОЗДАТЬ ТАБЛИЦУ 8d51c6b280c64bea848f29e5cad91ee3 (col1 TEXT)> нераспознанный токен: "8d51c6b280c64bea848f29e5cad91ee3"> Время: 0 с

MikeT 28.05.2018 05:22

Спасибо @MikeT, теперь все работает как надо.

greyBow 28.05.2018 05:27
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
460
1

Ответы 1

Я почти уверен, что "нераспознанный токен" - это имя таблицы и что он не заключен подходящим образом, что должно быть, потому что имя таблицы начинается с числа.

Решение могло бы заключаться в том, чтобы заключить его в [], `` (серьезные акценты, то есть клавиша слева от клавиши 1) '' или альтернативно поставить перед числовой частью нечисловой допустимый символ.

Подробнее о включении идентификаторов в SQL в понимании SQLite - ключевые слова SQLite

Вот пример с 4 типами вложений и, наконец, открытым / пустым именем таблицы, которое начинается с числа: -

CREATE TABLE "2d51c6b280c64bea848f29e5cad91ee3" (col1 TEXT)
> OK
> Time: 0.21s


CREATE TABLE '3d51c6b280c64bea848f29e5cad91ee3' (col1 TEXT)
> OK
> Time: 0.221s


CREATE TABLE [4d51c6b280c64bea848f29e5cad91ee3] (col1 TEXT)
> OK
> Time: 0.206s


CREATE TABLE `5d51c6b280c64bea848f29e5cad91ee3` (col1 TEXT)
> OK
> Time: 0.251s


CREATE TABLE 1d51c6b280c64bea848f29e5cad91ee3 (col1 TEXT)
> unrecognized token: "1d51c6b280c64bea848f29e5cad91ee3"
> Time: 0s
  • Эта последняя попытка также повторяет ошибку; запретить фактическое целенаправленно измененное имя таблицы.

Другие вопросы по теме