2010-06-02 64 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