环境 delphi7 + SQL server 2000    表:CUNFEN      XM(varchar)     JSF(bigint)
    李连杰                   5    
      李                    -5
    张  三                  10    
     
    有如下语句:  
    
    with ADOQuery1 do
    begin
      SQL.Clear;
      SQL.Add('SELECT XM,JSF+:FZ AS JSF');
      SQL.Add('FROM CUNFEN');
      SQL.Add('WHERE XM=:XM');
      Parameters.ParamByName('FZ').Value:=25;
      Parameters.ParamByName('XM').Value:='李连杰';
      open;
    end;    返回结果:
      XM     JSF
      李      20    如改写成
    
    with ADOQuery1 do
    begin
      SQL.Clear;
      SQL.Add('SELECT XM,JSF+25 AS JSF');
      SQL.Add('FROM CUNFEN');
      SQL.Add('WHERE XM=:XM');
      Parameters.ParamByName('XM').Value:='李连杰';
      open;
    end;    或
    with ADOQuery1 do
    begin
      SQL.Clear;
      SQL.Add('SELECT XM,JSF+:FZ AS JSF');
      SQL.Add('FROM CUNFEN');
      SQL.Add('WHERE XM=''李连杰''');
      Parameters.ParamByName('FZ').Value:=25;
      open;
    end;
  
    则返回结果均为:
      XM      JSF
    李连杰     30    用 SQL server 2000 的“事件探查器”跟踪发现第一种写法只传给 SQL server 2000 
    参数“XM”的第一个字,即“李连杰”的“李”字,所以结果出错。
    
    可是为什么会这样呢?难道是Delphi7的BUG?可是我刚刚打了1.1的升级补丁啊。哪位高手知道原因和解决方法? 
    十万火急!!!!

解决方案 »

  1.   

    with adoquery1 do
      begin
        close;
        sql.Clear;
        sql.Add('select xm, jsf+:fz as jsf');
        sql.Add(' from cunfen');
        sql.Add(' where xm=:xm');
        parameters.ParamByName('fz').Value := 25;
        parameters.ParamByName('xm').Size := 6;
        parameters.ParamByName('xm').Value := '李连杰';
        open;
       end;
      

  2.   

    我一般不用ParamByName这种东西,直接从SQL语句里写
    fz:integer;
    xm:string;
    fz=25;
    xm='李连杰';
    strsql:='select xm, jsf+'+inttostr(fz)+' as jsf from cunfen where xm='''+xm+'''';
    adoquery1.sql.clear;
    adoquery1.sql.add(strsql);
    .....
      

  3.   

    其中的xm可以改成Edit1.text之类
      

  4.   

    begin
          SQL.Close;
          SQL.Clear;
          SQL.Add('SELECT XM,JSF+:FZ AS JSF');
          SQL.Add('FROM CUNFEN');
          SQL.Add('WHERE XM=:XM');
          Parameters.ParamByName('FZ').Value:=25;
          Parameters.ParamByName('XM').Value:='李连杰';
          open;
        end;不会吧??我测试没问题啊
      

  5.   

    with ADOQuery1 do
        begin
          SQL.Clear;
          SQL.Add('SELECT XM,JSF+:FZ AS JSF');
          SQL.Add('FROM CUNFEN');
          SQL.Add('WHERE XM=:XM');
          Parameters.ParamByName('FZ').Value:=25;
          Parameters.ParamByName('XM').AsString:='李连杰'; //have a try
          open;
        end;
      

  6.   

    解决了,谢谢大家的帮助,特别感谢coeltdit和hellolongbin。
     提醒qybao,"adoquery"没有Parameters.ParamByName('XM').AsString的用法,这句话运行一定通不过的,你一定是和BDE的"query"弄混了。