unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, ADODB, StdCtrls, DBTables;type
  TForm1 = class(TForm)
    Button1: TButton;
    ADOQuery1: TADOQuery;
    Query1: TQuery;
    Button2: TButton;
    Database1: TDatabase;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
begin
  with adoquery1 do
  begin
    close;
    sql.Clear;
    sql.Add('update Northwind..Products set ProductName=''ChaiE`'' where ProductID = :var ');
    parameters[0].Value:=1;
    execsql;
  end;
end;procedure TForm1.Button2Click(Sender: TObject);
begin
  with query1 do
  begin
    close;
    sql.Clear;
    sql.Add('update Northwind..Products set ProductName=''ChaiE`'' where ProductID = :var ');
    params[0].AsInteger:=1;
    execsql;
  end;
end;end.    以上是存在BUG的代码,执行报错,问题出在ProductName=''ChaiE`''这句上,去掉''ChaiE`''中E后面的“`”小撇就不会报错,那个小撇就是键盘上数字1左面的按键。
用Delphi7在MSSQL7.0、MSSQL2000测试都如此。请教解决方法!

解决方案 »

  1.   

    忘了说明:如果去掉 :var变量, 没有params[0].AsInteger:=1;  那么也不会报错,显然是“`”和:var有冲突!
      

  2.   

    有这样的事儿啊,把:var换成别的名字呢,如:var1,var是Delphi的关键字呢。
      

  3.   

    实在不行,不要用参数了,用字串相加或用format吧:
     sql.Add(Format('update Northwind..Products set ProductName=''ChaiE`'' where ProductID =%d ',[1])); //这个1可用变量
      

  4.   

    ==============================================================================
     foxyy8888(SY强身,YY强国) ( ) 信誉:94    Blog  2006-10-06 20:30:00  得分: 0  
     
     
       主要问题应该在`上吧?
    ==============================================================================拜托,我下面的说明中把问题说的很清楚了,现在要研究解决方法!  
      

  5.   

    ============================================================
     keiy() ( ) 信誉:105    Blog  2006-9-29 20:14:44  得分: 0  
     
     
       
    实在不行,不要用参数了,用字串相加或用format吧:
     sql.Add(Format('update Northwind..Products set ProductName=''ChaiE`'' where ProductID =%d ',[1])); //这个1可用变量
    ============================================================除了以上大家都能知道的绕道解决方法外,有没有更直接的解决方法!
      
     
      

  6.   

    因为TParameters.ParseSQL函数对双引号(")和倒引号(`)进行了和引号同样的解析
    这样当要使用双引和倒引的时候就需要跟单引一样用两个,但是该函数又没处理这种重复
    相当于实际使用中无法使用双引和倒引解决办法只有修改ADODB.pas单元中的代码,将
     Literals = ['''', '"', '`'] 改为 Literals = [''''] 后重新编译
      

  7.   

    ADO的是修改ADODB
    BDE的是修改DB