2010-04-29 80 views
1

項目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不是列,它是我試圖插入的數據。我該如何解決這個問題?

回答

3

在SQL中,作爲數據的字符串常量必須用引號引起來。否則,字符串被解釋爲關鍵字,表名或列名,這就是發生在這裏的情況。用'p'代替普通的p。

+1

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

+0

SQLite並沒有強制你聲明爲Integer的列僅僅是實際只保留整數值,我以某種方式將這意味着我可以輸入不帶引號的字符串數據,就好像它可能是一個明顯浮動的整數。謝謝。 – BookOfGreg 2010-04-29 22:17:42

2

你值'p'是一個常量,所以你需要把它放在引號中。所以聲明需要是

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

您必須使用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