2016-07-07 68 views
2

我試圖插入一些信息到MySQL與帕斯卡爾,但是當我運行程序出現錯誤未知列

在字段列表中未知列「穆赫辛」

這是我的代碼

procedure TForm1.Button1Click(Sender: TObject); 
var 
    aSQLText: string; 
    aSQLCommand: string; 
    namee:string; 
    family:string; 
begin 
    namee:='mohsen'; 
    family:='dolatshah'; 
    aSQLText:= 'INSERT INTO b_tbl(Name,Family) VALUES (%s,%s)'; 
    aSQLCommand := Format(aSQLText, [namee, family]); 
    SQLConnector1.ExecuteDirect(aSQLCommand); 
    SQLTransaction1.Commit; 
end; 

我該如何解決這個問題?

回答

2

這是因爲你的

VALUES (%s,%s) 

不圍繞由引號namee和家庭變量內容。因此,您的後端Sql引擎認爲您的mohsen是列名稱,而不是值。

而是使用例如

VALUES (''%s'',''%s'') 

Namee := 'mohsen'; 
    Family := 'dolatshah'; 
    aSQLText:= 'INSERT INTO b_tbl(Name,Family) VALUES (''%s'',''%s'')'; 
    aSQLCommand := Format(aSQLText,[namee,family]); 

在我的答覆的原始版本,我解釋瞭如何通過「翻倍」在Sql單引號你試圖建立解決您的問題,因爲它似乎對我來說,你很難看到(在字面上)你在做什麼錯。

另一種(更好的)方法,以避免您的問題(和一個我總是在現實生活中使用)是使用QuotedStr()功能。然後,同樣的代碼將成爲

aSQLText := 'INSERT INTO b_tbl (Name, Family) VALUES (%s, %s)'; 
aSQLCommand := Format(aSQLText, [QuotedStr(namee), QuotedStr(family)]); 

根據在線幫助:

使用QuotedStr字符串s轉換爲一個帶引號的字符串。單引號字符(')>插入到S的開始和結尾,並且字符串中的每個單引號字符都重複。

「重複」意味着什麼,我稱之爲「倍增」。爲什麼這很重要,我用QuotedStr最主要的原因是爲了避免SQL數據庫引擎拋出一個錯誤,當您要發送的值包含一個單引號字符作爲奧賴利

嘗試增加含使用MySQL Workbench和你會明白我的意思是名稱的表中的一行。

所以,不僅使用QuotedStr使構建SQL語句在Delphi代碼串不容易出錯,而且還避免在後端的問題,太。

+0

我tryed但我doesent工作 –

+1

定義「不工作」。你會得到什麼錯誤信息?順便說一句,你q中的代碼看起來是假的(例如'field'拼寫錯誤),請不要這樣做,它會浪費每個人的時間 - 將你的確切代碼和錯誤信息粘貼到你的q中。 – MartynA

+0

eror是同一個eror我問 它試圖改變 –

-1

爲了避免這種問題和SQL注入你真的應該考慮使用SQL參數,這個,不是帕斯卡爾格式語句。

+0

這是一條評論,而不是答案。 –