【问题标题】:SQLite Delphi thowing up incorrect exceptionSQLite Delphi 抛出不正确的异常
【发布时间】:2011-02-13 14:47:15
【问题描述】:

Project CompetitionServer.exe 引发异常类 ESQLiteException,并带有消息“执行 SQL 时出错。
错误 [1]:SQL 错误或缺少数据库。
“插入 MatchesTable(MatchesID,RoundID,AkaFirstName,AoFirstName)VALUES(1,2,p,o)”:没有这样的列:p'。进程停止。使用 Step 或 Run 继续。

是的,p 不是列,它是我要插入的数据。我该如何解决这个问题?

【问题讨论】:

    标签: sql delphi exception sqlite


    【解决方案1】:

    在 SQL 中,作为数据的字符串常量必须用引号引起来。否则,字符串将被解释为关键字、表名或列名,这就是这里发生的情况。使用 'p' 而不是普通的 p。

    【讨论】:

    • SQLite 不会强制您声明为 Integer 的列实际仅保存整数值,我以某种方式认为这意味着我可以输入不带引号的字符串数据,就好像它可能是一个明显有缺陷的整数.谢谢。
    【解决方案2】:

    你的价值'p'是一个常数,所以你需要把它放在引号中。所以声明需要是

    INSERT INTO MatchesTable(MatchesID,RoundID,AkaFirstName,AoFirstName)VALUES(1,2,'p','o')
    

    【讨论】:

      【解决方案3】:

      您必须使用 SQL 参数。标准的 Delphi 方法:

      Query1.SQL.Text := 'INSERT INTO MatchesTable(MatchesID,RoundID,AkaFirstName,AoFirstName)VALUES(1,2,:p,:o)';
      Query1.Params[0].Value := ...;
      Query1.Params[1].Value := ...;
      Query1.ExecSQL;
      

      但细节可能取决于您使用的数据访问组件。

      【讨论】:

      • OP 没有来使用参数,但它肯定比通过连接 SQL sn-ps 和用户输入的数据来构建 SQL 语句更好 - 即方式谎言注入攻击。我将假设他的语句在运行时构建的。
      • 注入只是一个问题。很少有人 - 价值观的形成和表现。所以,虽然 NeoNMD 不一定要使用参数,但这是一个很好的做法,这必须是 DB 程序员的规则。
      • 我正在使用一个 delphi SQLite 包装器,我不相信它具有您上面提到的功能。所有 SQL 都作为字符串语句运行,使用以下内容: TSqlDatabase.ExecSQL(SQL:String);所以它只是直接尝试运行你传递给它的字符串。此外,由于所有数据均由系统生成,因此不存在注入风险。它绝不需要用户输入。然而,这是我第一次尝试在程序中实际使用数据库,因此将在任何进一步的项目中研究它。
      猜你喜欢
      • 1970-01-01
      • 2022-01-01
      • 1970-01-01
      • 2015-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多