【问题标题】:SQLite error unrecognized token UnitySQLite 错误 unrecognized token Unity
【发布时间】:2017-01-10 16:10:55
【问题描述】:

我正在使用 Unity,这是我的代码的一点点 sn-p。我要做的就是将data.tokendata.expire 放入SQLite。由于某种原因,它不断向我抛出一个错误:

SqliteException: SQLite error
unrecognized token: "587503bc773a565d52401c87"
Mono.Data.Sqlite.SQLite3.Prepare (Mono.Data.Sqlite.SqliteConnection cnn, System.String strSql, Mono.Data.Sqlite.SqliteStatement previous, UInt32  timeoutMS, System.String& strRemain)
Mono.Data.Sqlite.SqliteCommand.BuildNextCommand ()

我不知道令牌是如何无法识别的,在 SQLite 中,Token 字段是 STRINGExpire 字段是 INTEGER

IncomingTokenData data = IncomingTokenData.CreateFromJSON(www.text);

string conn = "URI=file:" + Application.dataPath + "/MyDataBase.s3db"; //Path to database.
var sqlQuery = "INSERT INTO MyDataBase(Token, Expire) VALUES(" + data.token +", " + data.expire + ")";

if(!string.IsNullOrEmpty(www.error)) {
    ErrText.text = "Error: " + www.error;
}else{
    if(data.pass == "1"){
        IDbConnection dbconn;
        dbconn = (IDbConnection) new SqliteConnection(conn);
        dbconn.Open(); //Open connection to the database.
        IDbCommand dbcmd = dbconn.CreateCommand();
        dbcmd.CommandText = sqlQuery;
        dbcmd.ExecuteNonQuery();

【问题讨论】:

    标签: sqlite unity3d


    【解决方案1】:

    在 SQL 查询中,您应该用单引号将字符串值括起来(在这种情况下,请在 data.token 周围加上引号):

    var sqlQuery = "INSERT INTO MyDataBase(Token, Expire) VALUES('" + data.token +"', " + data.expire + ")";
    

    请注意,字符串连接并不是构建 SQL 查询的最佳方法 - 避免这些问题的更可靠方法是使用占位符,例如用于添加参数的 built-in functionality IDbCommand has

    var sqlQuery = "INSERT INTO MyDataBase(Token, Expire) VALUES(@token, @expire)";
    
    if(!string.IsNullOrEmpty(www.error)) {
        ErrText.text = "Error: " + www.error;
    }else{
        if(data.pass == "1"){
            IDbConnection dbconn;
            dbconn = (IDbConnection) new SqliteConnection(conn);
            dbconn.Open(); //Open connection to the database.
            IDbCommand dbcmd = dbconn.CreateCommand();
            dbcmd.Parameters.Add("@token", SqlDbType.VarChar).Value = data.token;
            dbcmd.Parameters.Add("@expire", SqlDbType.Int).Value = data.expire;
            dbcmd.CommandText = sqlQuery;
            dbcmd.ExecuteNonQuery();
    

    使用此方法,值会根据其数据类型正确格式化。

    【讨论】:

    • @CorySparks 很高兴为您提供帮助!有时,如果您使用 String.Format() 构建查询,则更容易发现这些内容,但请做最适合您的事情。
    • IDbConnection 东西没有使用占位符的方法吗?
    • @simbabque 啊,你说得对。我忘记了 SQLite 实际上有自己的添加参数的方式,如Adding parameters in SQLite with C# 的最高投票答案中所述 - 这是我涉足 SQLite 时更喜欢的方式。
    • 其实这主要是司机在做。一些 RDBMS 本身支持 ? 占位符,但不是全部,因此驱动程序通过正确引用来模拟它们。在任何情况下,您都应该更新您的答案以说明问题所在,但也应指出应该始终使用占位符。 SQL 注入也可能发生在非 Web 应用程序中,我们不希望妈妈删除我们的存档游戏,对吗? :)
    • @simbabque 感谢您的见解!我已将建议和修改代码添加到答案中。
    猜你喜欢
    • 1970-01-01
    • 2021-07-09
    • 2021-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多