表结构
CREATE TABLE [TEST_TABLE] (
[FID] [varchar] (100) COLLATE Chinese_PRC_CI_AS NOT NULL ,
CONSTRAINT [PK_TEST_TABLE] PRIMARY KEY  CLUSTERED 
(
[FID]
)  ON [PRIMARY] 
) ON [PRIMARY]
GO在D7中代码中:
insert into TEST_TABLE (FID) values (:FValue) 在传入参数后可以正常执行
insert into TEST_TABLE (FID) values ('XXX'+ :FValue +'YYY') 在传入参数后也可以正常执行
但是在之前的串中若含有奇数个双引号,
设想:insert into TEST_TABLE (FID) values ('X"XX'+ :FValue +'YYY')
则会出错:':'附近有语法错误这显然是冒号和双引号共同引起的问题,但是不知道原因
如果要实现这个功能(有参数,且参数前需要拼接奇数个双引号),应当怎么处理呢?
发现这个问题的背景:
在要text类型中插入一个xml串,xml串中属性都是双引号引起的,
其中有一个属性值需要通过参数传入,因为事先不知且要求包入同一事务处理,因此不得以采用参数

解决方案 »

  1.   

    insert into TEST_TABLE (FID) values (QuotedStr('X"XX')+ :FValue +'YYY')
      

  2.   

    把这个QuotedStr('X"XX')写到外面,再传入。
      

  3.   


    这个不对的SysUtils.pas中
    function QuotedStr(const S: string): string;
    var
      I: Integer;
    begin
      Result := S;
      for I := Length(Result) downto 1 do
        if Result[I] = '''' then Insert('''', Result, I);
      Result := '''' + Result + '''';
    end;方法QuotedStr不是处理这问题的
      

  4.   

    为啥非得这么写?
    把要传的内容直接传进去就行了呗,一切都在FValue里
      

  5.   


    至于为什么要这么写,我已经简单说过了,
    因为组织SQL的时候并不知道这个值,
    而且模块并非与数据库直连,
    又要保证多句SQL处在同一事务中
      

  6.   

    另外还发现,对于多个字段的情况,这样也报错:
    insert into Table (A,B,C) values ('A"','B',:FValue)
    但这样就是正常执行的:
    insert into Table (A,B,C) values ('A"','B"',:FValue)还是同一个规律,就是冒号之前若出现偶数个双引号的话,就不会报错
      

  7.   

    一:自己找到一个变通的方案:由于规律是冒号线必须要有两个双引号,因此这种情况下采用人工造一个双引号的方法,比如:
    insert into TEST_TABLE (FID) values (Replace('','"','')+'X"XX'+ :FValue +'YYY')
    二:另外有个朋友给出一个方案稍微强悍点:
    把ADODB.pas文件打开,把第2588行代码中
      Literals = ['''', '"', '`'];
    的双引号去除
      

  8.   

    源码已经使用了' " ` :等等这些特殊字符来分解处理SQL语句,所以就应该避免这种写法
    既然用参数,为什么不全部用参数
    insert into Table (A,B,C) values (:FValue1,:FValue2,:FValue3)