Delphi / MySQL:转义字符串问题

问题描述 投票:0回答:2

我在转义字符串时遇到问题。我使用了 QuotedStr() 函数 - 这还不够吗?

不幸的是,我试图引用的字符串相当混乱,但我会将其发布在这里,以防有人想将其粘贴到 WinMerge 或 KDiff3 等中。

我试图将整个 Delphi 表单存储到数据库中,而不是存储到 .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 控制台中执行,但不是从 Delphi 中执行,在 Delphi 中我将该命令作为参数

command
传递给一个函数,该函数

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

我只能假设我在转义包含单引号的序列时遇到问题(并且 QuotedStr() 似乎没有转义反斜杠(?!))

我做错了什么?

mysql delphi escaping
2个回答
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;

6
投票

简短的回答 - 使用参数化查询!

© www.soinside.com 2019 - 2024. All rights reserved.