一個無法解釋的字符串問題(100分)

S

stuwe

Unregistered / Unconfirmed
GUEST, unregistred user!
to:maozhuxi

SQL.Add('select * from CPB where ID='+QuotedStr(ID));
ID是什麼你都看不懂?????
前面的ID是數據表的一個字段,後面的ID是傳進來的參數
 
M

maozhuxi

Unregistered / Unconfirmed
GUEST, unregistred user!
我没有说FindData('A:B"');是错的
但是你输入FindData('''),FindData('1''),FindData(''''').
这些肯定就要出错。
 
M

maozhuxi

Unregistered / Unconfirmed
GUEST, unregistred user!
to stuwe:
你没有懂我的意思
我的意思是你的ID不规范。
id不该有那些奇怪的字符。
如果你觉得那些出错比较烦,你可以屏蔽非法字符
就象屏蔽密码的非法字符一样
 
S

stuwe

Unregistered / Unconfirmed
GUEST, unregistred user!
to:maozhuxi
無法跟你解釋那麼清楚,
FindData('''),FindData('1''),FindData(''''').
如果像你那樣調用,就不是運行出錯的問題了,是語法就錯了

我的調用是這樣的:FindData(' "A:B" ')
拉開點點,清楚一些

這些是不能屏敞的
 
J

JamesBond_L

Unregistered / Unconfirmed
GUEST, unregistred user!
你的錯誤是什麼?
 
S

SmallGhost

Unregistered / Unconfirmed
GUEST, unregistred user!
我的做法是将单引号替换成两个单引号!
 
M

maozhuxi

Unregistered / Unconfirmed
GUEST, unregistred user!
你的问题不就是一个语法问题?!
 
S

stuwe

Unregistered / Unconfirmed
GUEST, unregistred user!
to:All
大家都試試吧,沒有錯的也就說沒有錯
至於是否是語法問題,試了就知道是否語法有問題
至於什麼錯誤,大家試試也就知道了
 
J

JamesBond_L

Unregistered / Unconfirmed
GUEST, unregistred user!
提供不一致或不完全的資訊導致參數物件不適當地被拒。
你說這個嗎?你就是要找ID = '"A:B"'的記錄吧?
好像在SQL的分析器上運行不出錯,但是D裡面錯。
 
R

realLearning

Unregistered / Unconfirmed
GUEST, unregistred user!
老兄用参数查询吧,直接的不行。
 
H

hfghfghfg

Unregistered / Unconfirmed
GUEST, unregistred user!
object ADOQuery1: TADOQuery
ParamCheck = False
Parameters = <>
Left = 224
Top = 96
end
 
H

hfghfghfg

Unregistered / Unconfirmed
GUEST, unregistred user!
ParamCheck = False


原因:
function TParameters.ParseSQL(SQL: string
DoCreate: Boolean): string;
const
Literals = ['''', '"', '`'];
var
Value, CurPos, StartPos: PChar;
CurChar: Char;
Literal: Boolean;
EmbeddedLiteral: Boolean;
Name: string;

function NameDelimiter: Boolean;
begin
Result := CurChar in [' ', ',', ';', ')', #13, #10];
end;

function IsLiteral: Boolean;
begin
Result := CurChar in Literals;
end;

function StripLiterals(Buffer: PChar): string;
var
Len: Word;
TempBuf: PChar;

procedure StripChar;
begin
if TempBuf^ in Literals then
StrMove(TempBuf, TempBuf + 1, Len - 1);
if TempBuf[StrLen(TempBuf) - 1] in Literals then
TempBuf[StrLen(TempBuf) - 1] := #0;
end;

begin
Len := StrLen(Buffer) + 1;
TempBuf := AllocMem(Len);
Result := '';
try
StrCopy(TempBuf, Buffer);
StripChar;
Result := StrPas(TempBuf);
finally
FreeMem(TempBuf, Len);
end;
end;

begin
Result := SQL;
Value := PChar(Result);
if DoCreate then Clear;
CurPos := Value;
Literal := False;
EmbeddedLiteral := False;
repeat
while (CurPos^ in LeadBytes) do Inc(CurPos, 2);
CurChar := CurPos^;
if (CurChar = ':') and not Literal and ((CurPos + 1)^ <> ':') then
begin
StartPos := CurPos;
while (CurChar <> #0) and (Literal or not NameDelimiter) do
begin
Inc(CurPos);
while (CurPos^ in LeadBytes) do Inc(CurPos, 2);
CurChar := CurPos^;
if IsLiteral then
begin
Literal := Literal xor True;
if CurPos = StartPos + 1 then EmbeddedLiteral := True;
end;
end;
CurPos^ := #0;
if EmbeddedLiteral then
begin
Name := StripLiterals(StartPos + 1);
EmbeddedLiteral := False;
end
else Name := StrPas(StartPos + 1);
if DoCreate then
AddParameter.Name := Name;
CurPos^ := CurChar;
StartPos^ := '?';
Inc(StartPos);
StrMove(StartPos, CurPos, StrLen(CurPos) + 1);
CurPos := StartPos;
end
else if (CurChar = ':') and not Literal and ((CurPos + 1)^ = ':') then
StrMove(CurPos, CurPos + 1, StrLen(CurPos) + 1)
else if IsLiteral then Literal := Literal xor True;
Inc(CurPos);
until CurChar = #0;
end;
 
K

Kisber

Unregistered / Unconfirmed
GUEST, unregistred user!
因为delphi把:B解释成参数,所以错。
SQL.Add('select * from CPB where ID=:paID');
parameters[0].value := 'A:B'
 
S

stuwe

Unregistered / Unconfirmed
GUEST, unregistred user!
to:hfghfghfg
設置這樣將無法使用參數操作
有沒有其它處理方法

按照這樣說就應該是delphi的這個函數有錯誤了,有沒有辦法解決?

 
H

hfghfghfg

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TForm1.FindData(ID: string);
begin
with ADOQuery1 do
begin
Close;
ParamCheck := false;
SQL.Clear;

SQL.Add('select * from CPB where ID=' + QuotedStr(ID));
Open;
ParamCheck := true;
end;
end;


ADOQuery1.Recordset:=ADOConnection1.Execute('');

 
S

stuwe

Unregistered / Unconfirmed
GUEST, unregistred user!
接受答案了.
 
B

byebye163

Unregistered / Unconfirmed
GUEST, unregistred user!
这是一个bug,是因为TParameters.ParseSQL函数对双引号(")和倒引号(`)进行了和引号同样的解析,也就是说-----如果在一个字符串内部要使用双引号和倒引号,只有象使用引号一样重复一次才不会引起TParameters.ParseSQL的错误,但该函数对这种重复又不作处理,直接将字符串传给了数据库驱动,这样实际上用户无法在字符串中使用单个双引号和倒引号,解决方法很简单,只要把adodb.TParameters.ParseSQL函数的常量
Literals = ['''', '"', '`']
修改为
Literals = ['''']
然后重新编译adodb.pas就可以了.
 
顶部