代码如下,点击Button1第一次插入可以成功,然后修改各edit.text再次插入记录就会出错。三天了,百思不得其解,望指点~~~~~~~~~谢谢
错误信息“Exception class EDatabaseError with message 'ADOCommand1: Parameter 'ljh' not found'”procedure TInForm.Equal();//参数赋值
begin
  ADOCommand1.Parameters.ParamByName('ljh').Value:=Edit1.Text;
  ADOCommand1.Parameters.ParamByName('mc').Value:=Edit2.Text;
  ADOCommand1.Parameters[2].Value:=Edit3.Text;
  ADOCommand1.Parameters[3].Value:=Edit6.Text;
  if Edit8.Text='' then
  begin
     ADOCommand1.Parameters[4].Value.sl:=0;
  end
  else
  begin
      ADOCommand1.Parameters[4].Value:=StrToFloat(Edit8.text);
  end;
  if Edit9.Text='' then
  begin
     ADOCommand1.Parameters[5].Value:=0;
  end
  else
  begin
      ADOCommand1.Parameters[5].Value:=StrToFloat(Edit8.text);
  end;
  ADOCommand1.Parameters[6].Value:=DateTimePicker1.Date;
  ADOCommand1.Parameters[7].Value:=ComboBox1.Text;
  ADOCommand1.Parameters[8].Value:=Edit7.Text;
  ADOCommand1.Parameters[9].Value:=Edit5.Text;
  ADOCommand1.Parameters[10].Value:=Memo1.Text;
end;procedure TInForm.Button1Click(Sender: TObject);//插入记录
begin
  Equal;
  place:='ljh,pxh,mc,sl,dw,dj,ckdm,ckkw,bz';
  sqlstr:=formatStr(place);
  ADOCommand1.CommandText:='insert into [accessory] ([ljh],[pxh],[mc],[sl],[dw],[dj],[ckdm],[ckkw],[bz]) values ('+sqlstr+')';
  ADOCommand1.Execute;
end;function TInForm.FormatStr(place:string):string;//构建SQL字符串
var
  arr:TStringList;
  i:Integer;
begin
  arr:=TStringList.Create;
  arr.DelimitedText:=place;
  arr.Delimiter:=',';
  for i:=0 to arr.Count-1 do
  begin
    case ADOCommand1.Parameters.FindParam(arr[i]).DataType of
    ftString:
    begin
           Result:=Result+QuotedStr(ADOCommand1.Parameters.ParamValues[arr[i]])+',';
    end;
    ftFloat:
    begin
          Result:=Result+FloatToStr(ADOCommand1.Parameters.ParamValues[arr[i]])+',';
    end;
    ftDateTime:
    begin
         Result:=Result+QuotedStr(ADOCommand1.Parameters.ParamValues[arr[i]])+',';
    end;
    end;
  end;
  Result:=LeftStr(Result,Length(Result)-1);
end;

解决方案 »

  1.   

    人家说了:“ADOCommand1: Parameter 'ljh' not found”再次执行SQL时,你的SQL里没有ljh的Parameter!程序没看完,不过基本上可以肯定,你第一次执行的SQL和第二次执行的SQL语句不一致打个断点跟一跟,很简单的
      

  2.   

    在ADOCommand1.Execute;前查看哈SQL语句是否正确
      

  3.   

    同样的程序执行第二次插入的时候,就在这句出错,
    ADOCommand1.Parameters.ParamByName('ljh').Value:=Edit1.Text; 这句过不去,所以不知道第二次插入的时候SQL语句是否正确(第一遍是肯定正确的)。难道ADOCommand的参数执行一遍就会自动释放空间或者改变内存地址吗?难道ADOCommand的参数不可以重新赋值吗?前几天的出错提示不是找不到'ljh'参数,是个什么什么地址错误,嘿嘿,不知道为什么今天又变成找不到参数了。肯请高手指点为感~~~~~~procedure TInForm.Equal();//参数赋值 
    begin 
      ADOCommand1.Parameters.ParamByName('ljh').Value:=Edit1.Text; 
      ADOCommand1.Parameters.ParamByName('mc').Value:=Edit2.Text; 
    end; procedure TInForm.Button1Click(Sender: TObject);//插入记录 
    begin 
      Equal; 
      place:='ljh,mc; 
      sqlstr:=formatStr(place); 
      ADOCommand1.CommandText:='insert into [accessory] ([ljh],[mc] )values ('+sqlstr+')'; 
      ADOCommand1.Execute; 
    end; function TInForm.FormatStr(place:string):string;//构建SQL字符串 
    var 
      arr:TStringList; 
      i:Integer; 
    begin 
      arr:=TStringList.Create; 
      arr.DelimitedText:=place; 
      arr.Delimiter:=','; // 这三句是将字符串以逗号为分隔符拆分为字符列表。
      for i:=0 to arr.Count-1 do //这个循环判断ADOCommand参数的类型,以控制是否加入引号
      begin 
        case ADOCommand1.Parameters.FindParam(arr[i]).DataType of 
        ftString: 
        begin 
              Result:=Result+QuotedStr(ADOCommand1.Parameters.ParamValues[arr[i]])+','; 
        end; 
        ftFloat: 
        begin 
              Result:=Result+FloatToStr(ADOCommand1.Parameters.ParamValues[arr[i]])+','; 
        end; 
        ftDateTime: 
        begin 
            Result:=Result+QuotedStr(ADOCommand1.Parameters.ParamValues[arr[i]])+','; 
        end; 
        end; 
      end; 
      Result:=LeftStr(Result,Length(Result)-1); //去掉尾部逗号。
    end;
      

  4.   


    帅锅都提醒你了,把SQL显示一下看看吧
      

  5.   

    我是执行程序,第一次是指第一次点击插入按钮,第二次是在没有退出程序的情况下修改edit的text值,再次点击插入按钮,你认为这样SQL.text会不会变,第一次为什么成功?????
    第二次赋值这句都过不去,怎么能看到SQL.text,再说出错是因为再次为adocommd1的参数赋值时出错,又不是执行语句的时候出错。真是头痛,找了一天的资料,还是没搞定!我就不信找不出原因来大不了俺狠狠啃下汇编
      

  6.   

    奇怪的就是为什么第一次点击插入的时候能找到名为ljh的参数,在程序没有退出的情况下,继续执行插入记录操作时却找不到名为ljh的参数,现在发现其实是连 ADOcommand1 都说是未定义了,ADOcommand1这个对象都没了,当然参数肯定也找不到,可为什么ADOcommand1会没了呢???????又没有执行关闭或释放类的操作。反正每次打开程序只能成功的插入一条记录,插入第二条就不行了。。(是MDI程序,SQL2005数据库,不过好像和这些环境都没啥关系)问题究竟出在哪里
      

  7.   

    你的 ADOCommand1.CommandText 是什么?
    在第一次执行后,ADOCommand1.CommandText 改变了,因为下面这句:
     ADOCommand1.CommandText:='insert into [accessory] ([ljh],[pxh],[mc],[sl],[dw],[dj],[ckdm],[ckkw],[bz]) values ('+sqlstr+')';
      

  8.   

    ADOCommand1.CommandText:='insert into [accessory] ([ljh],[mc] )values ('+sqlstr+')'; 
    你执行后,你的commandText已经被重新赋过值了
      

  9.   

    ADOCommand1 你在窗体中直接加入一个DBEDIT控件后,连接到数据库中
    再用QUERY连接,加入记录APPEND就可以了
      

  10.   


    是啊  这样的一个操作让你写了一个函数一个过程,ADOCommand1.CommandText:='insert into Table(...) values(...)';
    ADOCommand1.Execute;
    //加个提示也可以加在BtnClick 就行了,你非要写个几十行..........
      

  11.   


    Equal;
    放到
    ADOCommand1.Execute; 
    上面的最后一行试试看,(猜的):)
      

  12.   

    发现问题出在哪里了,原来第一次执行的时候因为设置了adocommand的参数,所以各个参数可以在构建语句之前正确赋值,然后这个参数集合就没了,所以只有将Command.text赋值为参数化的语句才能为参数正确赋值,也就是这样: ADOCommand1.CommandText:='insert into [accessory] ([ljh],[pxh],[mc],[sl],[dw],[dj],[ckdm],[ckkw],[bz]) values (:ljh,:pxh,:mc,:sl,:dw,:dj,:ckdm,:ckkw,:bz)'; 然后再时执行参数赋值的这个过程,就没有问题了.谢谢大家,
    特别是 sgzhou12345 因为你提出了另一个比较方便的方案,虽然还我初学delphi,从没有试过你说的方法,便起码你也教我一个比较简便的方法噻,呵呵,我现在就去试试,分全给你了,虽然少点,请别介意.呵呵~~~~~~~~~~同时感谢所有参与这个问题的朋友~~~~~~~~~~~~~感谢你们的无私和热情,谢谢~~~~~~~~~~~~
      

  13.   

    另外 jinhx  nongen 的指点比较靠谱,希望以后能得到你们更多的帮助, 现在回答一下 auqfiudh 的质疑,因为我这个模块的插入和更新语句非常多,同时数据字段也非常多,如果每次去构建SQL语句比较麻烦,也比较容易出错(经常多加或少加单引号之类的),所以才想起用这个一劳永逸的办法(现在经修改得到一个赋值函数,每次只要传入一个参数化的SQL语句,函数将自动为所需参数赋值),呵呵,感觉这样也比较好修改一些.
      

  14.   

    sgzhou12345 这方法果然不错,谢谢