表结构
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串中属性都是双引号引起的,
其中有一个属性值需要通过参数传入,因为事先不知且要求包入同一事务处理,因此不得以采用参数
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串中属性都是双引号引起的,
其中有一个属性值需要通过参数传入,因为事先不知且要求包入同一事务处理,因此不得以采用参数
这个不对的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不是处理这问题的
把要传的内容直接传进去就行了呗,一切都在FValue里
至于为什么要这么写,我已经简单说过了,
因为组织SQL的时候并不知道这个值,
而且模块并非与数据库直连,
又要保证多句SQL处在同一事务中
insert into Table (A,B,C) values ('A"','B',:FValue)
但这样就是正常执行的:
insert into Table (A,B,C) values ('A"','B"',:FValue)还是同一个规律,就是冒号之前若出现偶数个双引号的话,就不会报错
insert into TEST_TABLE (FID) values (Replace('','"','')+'X"XX'+ :FValue +'YYY')
二:另外有个朋友给出一个方案稍微强悍点:
把ADODB.pas文件打开,把第2588行代码中
Literals = ['''', '"', '`'];
的双引号去除
既然用参数,为什么不全部用参数
insert into Table (A,B,C) values (:FValue1,:FValue2,:FValue3)