2010-06-02 44 views
4

N00b在這裏,有轉義字符串的問題。我使用QuotedStr()函數 - 應該不夠。德爾福/ MySql:轉義字符串的問題

不幸的是,我想引用的字符串是相當混亂,但我會張貼在這裏萬一有人想將其粘貼到的WinMerge或KDiff3等

我試圖存儲整個德爾福形成到數據庫中,而不是形成一個.DFM文件。它只有一個字段,一個TEdit編輯框。

調試器顯示()的形式爲文本作爲

'object Form1: TScriptForm'#$D#$A' Left = 0'#$D#$A' Top = 0'#$D#$A' Align = alClient'#$D#$A' BorderStyle = bsNone'#$D#$A' ClientHeight = 517'#$D#$A' ClientWidth = 993'#$D#$A' Color = clBtnFace'#$D#$A' Font.Charset = DEFAULT_CHARSET'#$D#$A' Font.Color = clWindowText'#$D#$A' Font.Height = -11'#$D#$A' Font.Name = 'MS Sans Serif''#$D#$A' Font.Style = []'#$D#$A' OldCreateOrder = False'#$D#$A' SaveProps.Strings = ('#$D#$A' 'Visible=False')'#$D#$A' PixelsPerInch = 96'#$D#$A' TextHeight = 13'#$D#$A' object Edit1: TEdit'#$D#$A' Left = 192'#$D#$A' Top = 64'#$D#$A' Width = 121'#$D#$A' Height = 21'#$D#$A' TabOrder = 8'#$D#$A' end'#$D#$A'end'#$D#$A 

主叫QuotedStr之前和

''object Form1: TScriptForm'#$D#$A' Left = 0'#$D#$A' Top = 0'#$D#$A' Align = alClient'#$D#$A' BorderStyle = bsNone'#$D#$A' ClientHeight = 517'#$D#$A' ClientWidth = 993'#$D#$A' Color = clBtnFace'#$D#$A' Font.Charset = DEFAULT_CHARSET'#$D#$A' Font.Color = clWindowText'#$D#$A' Font.Height = -11'#$D#$A' Font.Name = ''MS Sans Serif'''#$D#$A' Font.Style = []'#$D#$A' OldCreateOrder = False'#$D#$A' SaveProps.Strings = ('#$D#$A' ''Visible=False'')'#$D#$A' PixelsPerInch = 96'#$D#$A' TextHeight = 13'#$D#$A' object Edit1: TEdit'#$D#$A' Left = 192'#$D#$A' Top = 64'#$D#$A' Width = 121'#$D#$A' Height = 21'#$D#$A' TabOrder = 8'#$D#$A' end'#$D#$A'end'#$D#$A''' 

之後。

奇怪的是,我的完整的命令

'INSERT INTO designerFormDfm(designerFormDfmText) VALUES ("'object Form1: TScriptForm'#$D#$A' Left = 0'#$D#$A' Top = 0'#$D#$A' Align = alClient'#$D#$A' BorderStyle = bsNone'#$D#$A' ClientHeight = 517'#$D#$A' ClientWidth = 993'#$D#$A' Color = clBtnFace'#$D#$A' Font.Charset = DEFAULT_CHARSET'#$D#$A' Font.Color = clWindowText'#$D#$A' Font.Height = -11'#$D#$A' Font.Name = ''MS Sans Serif'''#$D#$A' Font.Style = []'#$D#$A' OldCreateOrder = False'#$D#$A' SaveProps.Strings = ('#$D#$A' ''Visible=False'')'#$D#$A' PixelsPerInch = 96'#$D#$A' TextHeight = 13'#$D#$A' object Edit1: TEdit'#$D#$A' Left = 192'#$D#$A' Top = 64'#$D#$A' Width = 121'#$D#$A' Height = 21'#$D#$A' TabOrder = 8'#$D#$A' end'#$D#$A'end'#$D#$A''");' 

在MySQL控制檯執行,而不是從德爾福,我在那裏傳遞命令的參數command的功能,

ADOCommand.CommandText := command; 
    ADOCommand.CommandType := cmdText; 
    ADOCommand.Execute(); 

我只能假設我有escpaing包含單引號的序列的問題(並且QuotedStr()似乎無法避免背底(?!))

我在做什麼顯然是明顯錯誤的?

+0

QuotedStr不意味着什麼,它包圍在引號字符字符串傳遞,在需要的時候增加一倍。它從來不是一個普遍的逃避函數,特別是因爲Delphi從來沒有使用C類逃逸。 – 2010-06-02 16:33:52

回答

8

@mawg,@ da-soft建議沒問題,與插入和更新交互的最佳方式是使用參數。

檢查該樣本

var 
ADOCommand : TADOCommand; 
begin 
    ADOCommand:=TADOCommand.Create(nil); 
    try 
    ADOCommand.Connection:=AdoConnection; 
    ADOCommand.Parameters.Clear; 
    ADOCommand.CommandText:='INSERT INTO designerFormDfm (designerFormDfmText) VALUES (:designerFormDfmText)'; 
    ADOCommand.ParamCheck:=False; 
    ADOCommand.Parameters.ParamByName('designerFormDfmText').Value:= YourData; 
    ADOCommand.Execute; 
    finally 
    ADOCommand.Free; 
    end; 
end; 
+1

非常感謝,這是更有幫助:-)我會嘗試它,讓你知道。 – Mawg 2010-06-03 02:12:52

+0

指定給ADOCommand.CommandText給出「參數是錯誤的類型,超出了可接受的範圍,或者相互衝突」。我會谷歌的解決方案和報告 – Mawg 2010-06-03 02:31:23

+1

@mawg,你使用的是什麼版本的德爾福? – RRUZ 2010-06-03 03:24:44

6

簡短的答案 - 使用參數化查詢!

+2

+1,因爲有6人投了票。現在,n00b問題 - 這是什麼意思? Nvm,我會google的。 – Mawg 2010-06-03 02:11:28

+1

不需要谷歌,請參閱@RRUZ有用的答案 – Mawg 2010-06-03 02:32:38