SQLite Delphi增加了不正常的异常

问题描述:

项目CompetitionServer.exe引发异常类ESQLiteException,消息'执行SQL时出错。
错误[1]:SQL错误或缺少数据库。
“INSERT INTO MatchesTable(MatchesID,RoundID,AkaFirstName,AoFirstName)VALUES(1,2,p,o)”:no such column:p'。进程停止。使用“步骤”或“运行”继续。SQLite Delphi增加了不正常的异常

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

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

+1

而'o'而不是普通的o。 – mghie 2010-04-29 03:53:49

+0

SQLite并没有强制你声明为Integer的列仅仅是实际只保留整数值,我以某种方式将这意味着我可以输入不带引号的字符串数据,就好像它可能是一个明显浮动的整数。谢谢。 – BookOfGreg 2010-04-29 22:17:42

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

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

您必须使用SQL参数。标准德尔福方法:

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; 

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

+2

OP没有*使用参数,但它肯定比通过连接SQL片段和用户输入的数据来构建SQL语句更好 - 这种方式就是注入攻击。我将假设他的陈述*是在运行时建立的。 – mghie 2010-04-29 03:56:53

+0

注射只是一个问题。几乎没有其他人 - 价值形式化和表现。所以,尽管NeoNMD不必使用参数,但这是一个很好的做法,它必须是数据库程序员规则。 – 2010-04-29 05:38:27

+0

我使用的是一个delphi SQLite包装器,我不相信上面提到的功能。 所有SQL以字符串语句的形式运行,使用以下内容: TSqlDatabase.ExecSQL(SQL:String); 所以它只是直接尝试运行你传递它的字符串。 此外,由于系统生成的所有数据都没有注入风险。在任何时候都不需要用户输入。然而,这是我第一次尝试在程序中实际使用数据库,因此会考虑进一步的项目。 – BookOfGreg 2010-04-29 22:19:56